Как выдержать сравнение, sqlite ДОБАВЛЯЮТ МЕТКУ ВРЕМЕНИ к значениям

У меня есть база данных 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');

23
задан muru 8 April 2018 в 03:08
поделиться

2 ответа

Проблема заключается в способе вставки данных в таблицу: синтаксис +0200 не соответствует ни одному из форматов времени SQLite. :

  1. ГГГГ-ММ-ДД
  2. ГГГГ-ММ-ДД ЧЧ: ММ
  3. ГГГГ-ММ-ДД ЧЧ: ММ: СС
  4. ГГГГ-ММ-ДД ЧЧ: ММ: СС. SSS
  5. YYYY-MM-DDTHH: MM
  6. YYYY-MM-DDTHH: MM: SS
  7. YYYY-MM-DDTHH: MM: SS.SSS
  8. HH: MM
  9. HH: MM: SS
  10. ЧЧ: ММ: SS.SSS
  11. сейчас
  12. DDDDDDDDDD

Изменение его на использование формата 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

Если ни один из них не решает вашу проблему (и даже если они решают!), Вы должны всегда публиковать некоторые данные, чтобы другие люди могли воспроизвести вашу проблему.Вы даже можете смело придумать подмножество ваших исходных данных, которое все еще воспроизводит проблему.

43
ответ дан 29 November 2019 в 01:51
поделиться

Поддержка SQLite для типов даты / времени очень ограничена. Возможно, вам придется использовать собственный метод хранения информации о времени. По крайней мере, так я и сделал.

Вы можете определить свои собственные хранимые функции для сравнения, используя SQLite create_function () API.

1
ответ дан 29 November 2019 в 01:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: