我有一个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','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中的任何一个都不匹配:
将其更改为使用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/