Jak mieć automatyczny znacznik czasu w SQLite?

Mam bazę danych SQLite w wersji 3 i używam C# do tworzenia aplikacji, która korzysta z tej bazy danych.

Chcę użyć pola timestamp w tabeli dla współbieżności, ale zauważam, że gdy wstawiam nowy rekord, to pole to nie jest ustawione i ma wartość null.

Na przykład w MS SQL Server Jeśli używam pola timestamp to jest aktualizowane przez bazę danych, nie muszę sam ustawiać. czy jest to możliwe w SQLite?

Author: Fraser, 2013-01-22

6 answers

Wystarczy zadeklarować domyślną wartość dla pola:

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

Jeśli jednak twoje polecenie INSERT jawnie ustawi to pole na NULL, zostanie ono ustawione na NULL.

 164
Author: CL.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-10 00:45:04

Możesz utworzyć pole TIMESTAMP w tabeli na SQLite, zobacz to:

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');

Oto wynik:

SELECT * FROM my_table;

Tutaj wpisz opis obrazka

 60
Author: mr.boyfox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-07 17:16:49

Odczyt datefunc roboczym przykładem automatycznego uzupełniania datetime będzie:

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'))
   ...> );

Wstawmy kilka wierszy w sposób inicjujący automatyczne uzupełnianie datetime:

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

Zapisane dane wyraźnie pokazują, że dwie pierwsze są takie same, ale nie trzecia funkcja:

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

Zwróć uwagę, że funkcje SQLite są otoczone w nawiasie! Jak trudno było to pokazać na jednym przykładzie?

Baw się dobrze!
 7
Author: centurian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 06:17:33

Aby uzupełnić odpowiedzi powyżej...

Jeśli używasz EF, dodaj właściwość adnotacją danych [Timestamp], wtedy przejdź do nadpisanego OnModelCreating wewnątrz klasy context i dodaj ten płynny kod API:

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

Spowoduje ustawienie domyślnej wartości dla wszystkich danych, które zostaną wstawione do tej tabeli.

 3
Author: Rafael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 18:44:03

Możesz użyć niestandardowego datetime za pomocą...

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

Użyj 'NOW', 'localtime', aby uzyskać bieżącą datę systemową, w przeciwnym razie wyświetli się jakiś przeszły lub inny czas w Twojej bazie danych po czasie wstawiania do twojego db.

Dziękuję...
 2
Author: Javed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 06:44:18

Możesz użyć wyzwalaczy. działa bardzo dobrze

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
Author: Rahmat Anjirabi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 12:44:24