我有一个Sqlite数据库,我要在其中选择TIMESTAMP列中的值在某个日期之前的行。我认为这很简单,但我无法完成。我已经试过了:

SELECT * FROM logged_event WHERE logged_event.CREATED_AT < '2010-05-28 16:20:55'

以及各种变化形式,例如日期函数。我已经读过http://sqlite.org/lang_datefunc.htmlhttp://www.sqlite.org/datatypes.html,并且我希望该列是数字类型,并且将在unix时间戳值上进行比较。显然不是。谁能帮忙?如果很重要,我正在Sqlite Expert Personal中进行尝试。

编辑:

这是类型表说明:
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's time formats中的任何一个都不匹配:

  • YYYY-MM-DD
  • YYYY-MM-DD HH:MM
  • YYYY-MM-DD HH:MM:SS
  • YYYY-MM-DD HH:MM:SS.SSS
  • YYYY-MM-DDTHH:MM
  • YYYY-MM-DDTHH:MM:SS
  • YYYY-MM-DDTHH:MM:SS.SSS
  • HH:MM
  • HH:MM:SS
  • HH:MM:SS.SSS
  • 现在
  • 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列中包含什么样的数据。如果确实是日期时间,它将与字符串正确比较:
    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
    

    如果这些方法都不能解决您的问题(即使可以解决!),您也应该总是发布一些数据,以便其他人重现您的问题。您甚至应该随意提出仍会重现问题的原始数据的子集。

    关于sql - 如何比较sqlite的TIMESTAMP值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2930768/

    10-16 10:37