Comment avoir un horodatage automatique dans SQLite?

J'ai une base de données SQLite, version 3 et j'utilise C# pour créer une application qui utilise cette base de données.

Je veux utiliser un champ d'horodatage dans une table pour la concurrence, mais je remarque que lorsque j'insère un nouvel enregistrement, ce champ n'est pas défini et est null.

Par exemple, dans MS SQL Server, si j'utilise un champ d'horodatage, il est mis à jour par la base de données, Je ne dois pas le définir moi-même. est-ce possible dans SQLite?

101
demandé sur Fraser 2013-01-22 19:17:51

6 réponses

Il suffit de déclarer une valeur par défaut pour un champ:

CREATE TABLE MyTable(
    ID INTEGER PRIMARY KEY,
    Name TEXT,
    Other STUFF,
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);

Cependant, si votre INSERT commande définit explicitement dans ce champ NULL, il sera mis à NULL.

164
répondu CL. 2013-04-10 00:45:04

Vous pouvez créer un champ D'horodatage dans la table sur SQLite, voir ceci:

CREATE TABLE my_table (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    name VARCHAR(64),
    sqltime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

INSERT INTO my_table(name, sqltime) VALUES('test1', '2010-05-28T15:36:56.200');
INSERT INTO my_table(name, sqltime) VALUES('test2', '2010-08-28T13:40:02.200');
INSERT INTO my_table(name) VALUES('test3');

C'est le résultat:

SELECT * FROM my_table;

entrez la description de l'image ici

60
répondu mr.boyfox 2014-03-07 17:16:49

Lecture datefunc un exemple fonctionnel d'achèvement automatique datetime serait:

sqlite> CREATE TABLE 'test' ( 
   ...>    'id' INTEGER PRIMARY KEY,
   ...>    'dt1' DATETIME NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')), 
   ...>    'dt2' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime')), 
   ...>    'dt3' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime'))
   ...> );

Insérons quelques lignes d'une manière qui initie l'achèvement automatique datetime:

sqlite> INSERT INTO 'test' ('id') VALUES (null);
sqlite> INSERT INTO 'test' ('id') VALUES (null);

Stockées les données indiquent clairement que les deux premiers sont les mêmes, mais pas la troisième fonction:

sqlite> SELECT * FROM 'test';
1|2017-09-26 09:10:08|2017-09-26 09:10:08|2017-09-26 09:10:08.053
2|2017-09-26 09:10:56|2017-09-26 09:10:56|2017-09-26 09:10:56.894

Faites attention que les fonctions SQLite sont entourées entre parenthèses! La difficulté était-ce pour montrer l'exemple?

Amusez-vous!

7
répondu centurian 2017-09-26 06:17:33

Pour compléter les réponses ci-dessus...

Si vous utilisez EF, ornez la propriété D'une Annotation de données [horodatage], puis accédez à OnModelCreating surchargé, dans votre classe de contexte, et ajoutez ce code API fluide:

modelBuilder.Entity<YourEntity>()
                .Property(b => b.Timestamp)
                .ValueGeneratedOnAddOrUpdate()
                .IsConcurrencyToken()
                .ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");

Il fera une valeur par défaut à toutes les données qui seront insérées dans cette table.

3
répondu Rafael 2017-06-05 18:44:03

Vous pouvez utiliser le datetime personnalisé en utilisant...

 create table noteTable3 
 (created_at DATETIME DEFAULT (STRFTIME('%d-%m-%Y   %H:%M', 'NOW','localtime')),
 title text not null, myNotes text not null);

Utilisez 'NOW', 'localtime' pour obtenir la date système actuelle sinon il affichera une heure passée ou autre dans votre base de données après l'insertion dans votre base de données.

Merci...

2
répondu Javed 2017-02-20 06:44:18

Vous pouvez utiliser des déclencheurs. fonctionne très bien

CREATE TABLE MyTable(
ID INTEGER PRIMARY KEY,
Name TEXT,
Other STUFF,
Timestamp DATETIME);


CREATE TRIGGER insert_Timestamp_Trigger
AFTER INSERT ON MyTable
BEGIN
   UPDATE MyTable SET Timestamp =STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;

CREATE TRIGGER update_Timestamp_Trigger
AFTER UPDATE On MyTable
BEGIN
   UPDATE MyTable SET Timestamp = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;
0
répondu Rahmat Anjirabi 2018-05-30 12:44:24