我有一个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');
Mark Rushako.. 43
问题在于您将数据插入表中的方式:+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
如果你在插入格式时绝对无法改变格式,你可能不得不回到做"聪明"的事情并修改实际的字符串(即+
用a 替换.
等等).
(原始答案)
您尚未描述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
如果这些都没有解决你的问题(即使他们这样做了!)你应该总是发布一些数据,以便其他人可以重现你的问题.您甚至可以随意提出仍然可以重现问题的原始数据的子集.
问题在于您将数据插入表中的方式:+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
如果你在插入格式时绝对无法改变格式,你可能不得不回到做"聪明"的事情并修改实际的字符串(即+
用a 替换.
等等).
(原始答案)
您尚未描述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
如果这些都没有解决你的问题(即使他们这样做了!)你应该总是发布一些数据,以便其他人可以重现你的问题.您甚至可以随意提出仍然可以重现问题的原始数据的子集.