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

95

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

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

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

Теги:
timestamp

5 ответов

136
Лучший ответ

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

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

Однако, если ваша команда INSERT явно устанавливает это поле в NULL, она будет установлена ​​на NULL.

  • 4
    Это не совсем эквивалентно временной отметке SQL Server, потому что она основана на системных часах; если вы измените часы, значение может вернуться назад. В SQL Server значения отметок времени всегда увеличиваются.
  • 13
    Я думаю, что нет типа поля DATETIME: sqlite.org/datatype3.html
Показать ещё 6 комментариев
51

Вы можете создать поле TIMESTAMP в таблице на 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;

Изображение 1134

  • 0
    Невозможно добавить столбец с непостоянным значением по умолчанию (ALTER TABLE "main". "Xxx_data" ADD COLUMN "creation_date" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)
2

Чтение 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'))
   ...> );

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

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 окружены в скобках! Насколько сложно было показать это в одном примере?

Удачи!

2

вы можете использовать пользовательское datetime, используя...

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

используйте 'NOW', 'localtime', чтобы получить текущую системную дату else, она покажет некоторое прошлое или другое время в вашей базе данных после времени вставки в вашем db.

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

  • 1
    Полезно, если вам нужны микросекунды; Вы можете использовать DEFAULT (STRFTIME ('% Y-% m-% d% H:% M:% f', 'NOW', 'localtime')) `. Просто сказать, что DEFAULT CURRENT_TIMESTAMP даст вам степень детализации всего одну секунду.
  • 0
    Это определенно работает! обратите внимание на функцию strftime (), заключенную в круглые скобки!
0

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

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

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

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

  • 0
    Знаете, как Entity работает на Android, в приложении Xamarin? Не успел пройти тестирование, хотя было бы неплохо заменить DAL на.
  • 0
    Я не нахожу пакет, необходимый для sqliteHasDefault. Вы знаете, какой пакет я должен получить от nuget?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню