web-dev-qa-db-fra.com

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 souhaite utiliser un champ d'horodatage dans une table pour l'accès simultané, mais je remarque que lorsque j'insère un nouvel enregistrement, ce champ n'est pas défini et a la valeur null.

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

119
Álvaro García

Déclarez simplement une valeur par défaut pour un champ:

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

Toutefois, si votre commande INSERT définit explicitement ce champ sur NULL, il sera défini sur NULL.

183
CL.

Vous pouvez créer un champ TIMESTAMP 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');

Voici le résultat:

SELECT * FROM my_table;

enter image description here

63
mr.boyfox

En lisant datefunc , un exemple utile d’achèvement automatique de date/heure 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 de manière à lancer la complétion automatique de date/heure:

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

Les données stockées montrent 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

Attention, les fonctions SQLite sont entourées de parenthèses! Comment était-ce difficile de le montrer dans un exemple?

S'amuser!

9
centurian

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;
6
Rahmat Anjirabi

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

Si vous utilisez EF, ornez la propriété avec Data Annotation [Timestamp], puis accédez à OnModelCreating surchargé, dans votre classe de contexte, et ajoutez ce code API Fluent:

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

Cela créera une valeur par défaut pour toutes les données qui seront insérées dans cette table.

5
Rafael

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 actuelle du système, sinon il affichera une heure passée ou autre dans votre base de données après le temps d'insertion dans votre base de données.

Merci...

2
Javed