У меня есть база данных Sqlite, в которой я хочу выбрать строки, из которых значение в столбце TIMESTAMP перед определенной датой. Я думал бы, что это просто, но я не мог сделать его. Я попробовал это:
SELECT * FROM logged_event WHERE logged_event.CREATED_AT < '2010-05-28 16:20:55'
и различные вариации на него, как с функциями даты. Я прочитал http://sqlite.org/lang_datefunc.html и http://www.sqlite.org/datatypes.html, и я ожидал бы, что столбец будет числовым типом, и что сравнение было бы сделано на значении метки времени Unix. Apparantly нет. Кто-либо, кто может помочь? Если это имеет значение, я испытываю это в Персональном Эксперте Sqlite.
Править:
Вот описание таблицы типа:
CREATE TABLE [logged_event]
(
[id] INTEGER NOT NULL PRIMARY KEY,
[created_at] TIMESTAMP,
[name] VARCHAR(64),
[data] VARCHAR(512)
);
И данные тестирования:
INSERT INTO table VALUES(1,'2010-05-28T15:36:56+0200','test','test');
INSERT INTO table VALUES(2,'2010-05-28T16:20:49+0200','test','test');
INSERT INTO table VALUES(3,'2010-05-28T16:20:51+0200','test','test');
INSERT INTO table VALUES(4,'2010-05-28T16:20:52+0200','test','test');
INSERT INTO table VALUES(5,'2010-05-28T16:20:53+0200','test','test');
INSERT INTO table VALUES(6,'2010-05-28T16:20:55+0200','test','test');
INSERT INTO table VALUES(7,'2010-05-28T16:20:57+0200','test','test');
Проблема заключается в способе вставки данных в таблицу: синтаксис +0200
не соответствует ни одному из форматов времени SQLite. :
Изменение его на использование формата SS.SSS работает правильно:
sqlite> CREATE TABLE Foo (created_at TIMESTAMP);
sqlite> INSERT INTO Foo VALUES('2010-05-28T15:36:56+0200');
sqlite> SELECT * FROM Foo WHERE foo.created_at < '2010-05-28 16:20:55';
sqlite> SELECT * FROM Foo WHERE DATETIME(foo.created_at) < '2010-05-28 16:20:55';
sqlite> INSERT INTO Foo VALUES('2010-05-28T15:36:56.200');
sqlite> SELECT * FROM Foo WHERE DATETIME(foo.created_at) < '2010-05-28 16:20:55';
2010-05-28T15:36:56.200
Если вы абсолютно не можете изменить формат при его вставке , возможно, вам придется вернуться к тому, чтобы сделать что-то «умное» и изменить фактическую строку (например, заменить +
на .
и т. д.).
(исходный ответ)
Вы не описали, какие данные содержатся в вашем столбце CREATED_AT
. Если это действительно datetime, оно будет правильно сравниваться со строкой:
sqlite> SELECT DATETIME('now');
2010-05-28 16:33:10
sqlite> SELECT DATETIME('now') < '2011-01-01 00:00:00';
1
Если оно сохранено как временная метка unix, вам нужно вызвать функцию DATETIME
со вторым аргументом как 'unixepoch'
для сравнения со строкой:
sqlite> SELECT DATETIME(0, 'unixepoch');
1970-01-01 00:00:00
sqlite> SELECT DATETIME(0, 'unixepoch') < '2010-01-01 00:00:00';
1
sqlite> SELECT DATETIME(0, 'unixepoch') == DATETIME('1970-01-01 00:00:00');
1
Если ни один из них не решает вашу проблему (и даже если они решают!), Вы должны всегда публиковать некоторые данные, чтобы другие люди могли воспроизвести вашу проблему.Вы даже можете смело придумать подмножество ваших исходных данных, которое все еще воспроизводит проблему.
Поддержка SQLite для типов даты / времени очень ограничена. Возможно, вам придется использовать собственный метод хранения информации о времени. По крайней мере, так я и сделал.
Вы можете определить свои собственные хранимые функции для сравнения, используя SQLite create_function () API.