如何比较sqlite的TIMESTAMP值
我有一个Sqlite数据库,我希望在某个date之前selectTIMESTAMP列中的值。 我会认为这很简单,但我无法完成。 我试过这个:
SELECT * FROM logged_event WHERE logged_event.CREATED_AT <'2010-05-28 16:20:55'
和它的各种变化,就像date函数一样。 我已经阅读过http://sqlite.org/lang_datefunc.html和http://www.sqlite.org/datatypes.html ,我希望这个列可以是一个数字types,并且可以在unix时间戳值。 可能不会。 任何人可以帮忙? 如果有关系,我正在Sqlite Expert Personal中试用。
编辑:
这里是types表的描述:
CREATE TABLE [logged_event] ( [id] INTEGER NOT NULL PRIMARY KEY, [created_at] TIMESTAMP, [name] VARCHAR(64), [data] VARCHAR(512) );
而testing数据:
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的任何时间格式都不匹配:
- 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
如果插入时绝对不能修改格式,则可能需要退回到“巧妙”的位置,然后修改实际的string(即用+
replace+
)。
(原始答案)
您尚未描述CREATED_AT
列中包含的数据types。 如果确实是一个date时间,它会正确比较一个string:
sqlite> SELECT DATETIME('now'); 2010-05-28 16:33:10 sqlite> SELECT DATETIME('now') < '2011-01-01 00:00:00'; 1
如果存储为unix时间戳,则需要使用第二个参数调用DATETIME
函数作为'unixepoch'
以与string进行比较:
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对date/时间types的支持非常有限。 您可能不得不自行维护时间信息。 至less,这就是我所做的。
您可以使用SQLite create_function()API定义自己的存储函数进行比较。
尽我所知,包含时区说明符是完全合理的; 看到文本“格式2到10可以…” 在http://www.sqlite.org/lang_datefunc.html但是,问题是只有date函数将时间戳解释为date。; 因此,为了进行实际比较,您需要通过date函数传递时间戳,或存储string比较工作的东西。 一种方法是编写应用程序,以便在插入的每个值和select语句中的每个文字值上调用datetime。 然而,在许多应用中,简单地不包括现有答案build议的时区可能更容易。