Как я могу сохранить текущую метку времени в SQLite в виде галочек? - PullRequest
11 голосов
/ 11 мая 2011

У меня есть база данных SQLite, где я храню даты в виде отметок.Я не использую формат ISO8601 по умолчанию.Допустим, у меня есть таблица, определенная следующим образом:

CREATE TABLE TestDate (LastModifiedTime DATETIME)

Используя SQL, я хочу вставить текущую дату и время.Если я выполню любое из приведенных ниже утверждений, я получу дату и время, сохраненные в виде строки, а не в тиках.

INSERT INTO TestDate (LastModifiedTime) VALUES(CURRENT_TIMESTAMP)
INSERT INTO TestDate (LastModifiedTime) VALUES(DateTime('now'))

Я посмотрел на документацию SQLite , ноКажется, я не нахожу никакой опции для получения текущей отметки времени в тиках.

Конечно, я могу определить параметр в C # и сохранить значение как System.DateTime.Это приводит к тому, что дата и время сохраняются в базе данных в тиках.

То, что я хотел бы сделать, это иметь возможность вставлять и обновлять текущую метку времени непосредственно из инструкции SQL.Как бы я это сделал?

Редактировать:

Причина, по которой я хочу, чтобы данные сохранялись в базе данных как тики, заключается в том, что даты хранятся в том же формате, что ихранится поставщиком данных ADO.Net, поэтому при запросе данных с использованием поставщика ADO.Net они корректно извлекаются как тип System.DataTime .Net.

Ответы [ 3 ]

20 голосов
/ 11 мая 2011

Эта странность SQLite вызвала у меня много страданий.

Простой способ - сохранять и извлекать как обычную метку времени

create table TestDate (
        LastModifiedTime datetime
);
insert into TestDate (LastModifiedTime) values (datetime('now'));
select datetime(LastModifiedTime), strftime('%s.%f', LastModifiedTime)  from TestDate;

Выход: 2011-05-10 21: 34: 46 | 1305063286.46.000

Болезненный способ - сохранить и получить как метку времени UNIX

Вы можете использовать strftime, чтобы получить значение в тиках. Кроме того, чтобы сохранить метку времени UNIX (примерно эквивалентную тикам), вы можете заключить количество секунд в одинарные кавычки.

 insert into TestDate (LastModifiedTime) values ('1305061354');

SQLite будет хранить это внутренне как некоторое другое значение, которое не является меткой времени UNIX. При извлечении вам нужно явно указать SQLite, чтобы он извлекался как отметка времени UNIX.

 select datetime(LastModifiedTime, 'unixepoch') FROM TestDate;

Чтобы сохранить текущую дату и время, используйте strftime ('% s', 'now').

 insert into TestDate (LastModifiedTime) VALUES (strftime('%s', 'now'));

Полный пример:

create table TestDate (
        LastModifiedTime datetime
);      
insert into TestDate (LastModifiedTime) values (strftime('%s', 'now'));
select datetime(LastModifiedTime, 'unixepoch') from TestDate;

При выполнении sqlite3 этот скрипт с печатью:

2011-05-10 21:02:34 (or your current time)
2 голосов
/ 11 мая 2011

После дальнейшего изучения документации SQLite и другой информации, найденной при преобразовании чисел даты, я пришел к следующей формуле, которая, как представляется, дает правильные результаты:

INSERT INTO TestDate(LastModifiedTime)
    VALUES(CAST((((JulianDay('now', 'localtime') - 2440587.5)*86400.0) + 62135596800) * 10000000 AS BIGINT))

Похоже, это болезненный способ создания чего-то, что, как я ожидал, будет доступно в виде встроенного формата datetime, особенно в том, что база данных поддерживает хранение значений datetime в тиках. Надеюсь, это станет полезным и для других.

Обновление:

Приведенная выше формула не идеальна для перехода на летнее время. См. Раздел Предупреждения и ошибки в документах SQLite по вопросам расчета местного времени.

1 голос
/ 09 декабря 2013

Следующая строка вернет количество миллисекунд, прошедших с начала эпохи UNIX:

SELECT (strftime('%s', 'now') - strftime('%S', 'now') + strftime('%f', 'now')) * 1000 AS ticks

Она работает путем захвата количества секунд с начала эпохи Unix (% s ), вычитаяколичество секунд в текущем времени (% S ), добавление количества секунд с десятичными знаками (% f ) и умножение результата на 1000 допреобразование из секунд в миллисекунды.

Вычитание и сложение должны добавить точность к значению без искажения результата.Как указано в документации SQLite, все случаи использования 'now' на одном шаге будут возвращать одно и то же значение.

...