Как иметь автоматическую метку времени в SQLite?



У меня есть база данных SQLite, версия 3, и я использую C# для создания приложения, которое использует эту базу данных.



Я хочу использовать поле timestamp в таблице для параллелизма, но я замечаю, что когда я вставляю новую запись, это поле не задано и равно null.



например, в MS SQL Server, если я использую поле timestamp, это обновляется базой данных, я не должен устанавливать сам. возможно ли это в SQLite?

1227   6  

6 ответов:

просто объявить значение по умолчанию для поля:

CREATE TABLE MyTable(
    ID INTEGER PRIMARY KEY,
    Name TEXT,
    Other STUFF,
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);
, если INSERT команда явно устанавливает это поле в NULL, он будет установлен в NULL.

вы можете создать поле метки времени в таблице на SQLite, см. Это:

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

вот результат:

SELECT * FROM my_table;

enter image description here

чтение datefunc рабочий пример автоматического завершения datetime будет:

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

давайте вставим несколько строк таким образом, чтобы инициировать автоматическое завершение datetime:

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

сохраненные данные ясно показывают, что первые два являются одинаковыми, но не третья функция:

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

обратите внимание, что функции SQLite заключены в скобки! Насколько сложно было это показать на одном примере?

есть весело!

чтобы дополнить ответы выше...

Если вы используете EF, украсьте свойство аннотацией данных [Timestamp], затем перейдите к переопределенному OnModelCreating, внутри вашего класса контекста, и добавьте этот свободный код API:

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

это сделает значение по умолчанию для всех данных, которые будут вставлены в эту таблицу.

вы можете использовать пользовательский datetime с помощью...

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

используйте "сейчас", "локальное время", чтобы получить текущую системную дату, иначе она покажет некоторое прошлое или другое время в вашей базе данных после времени вставки в вашу БД.

Спасибо Вам...

вы можете использовать триггеры. работает очень хорошо

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;

Comments

    Ничего не найдено.