我有一个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时间戳值上完成。不可见谁能帮忙?如果重要,我正在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'); INSERT INTO table VALUES(3,'2010-05-28T16:20:51+0200','test'); INSERT INTO table VALUES(4,'2010-05-28T16:20:52+0200','test'); INSERT INTO table VALUES(5,'2010-05-28T16:20:53+0200','test'); INSERT INTO table VALUES(6,'2010-05-28T16:20:55+0200','test'); INSERT INTO table VALUES(7,'2010-05-28T16:20:57+0200','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列中包含什么样的数据。如果它确实是一个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
如果这两个都没有解决您的问题(即使他们这样做),您应该始终发布一些数据,以便其他人可以重现您的问题。您甚至可以随时提出原始数据的一部分,仍然会再现问题。