如何比较sqlite TIMESTAMP值

Roe*_*oel 23 sql sqlite timestamp

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

SELECT * FROM logged_event WHERE logged_event.CREATED_AT < '2010-05-28 16:20:55'
Run Code Online (Sandbox Code Playgroud)

和日期函数一样,它有各种变化.我已经阅读了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)
);
Run Code Online (Sandbox Code Playgroud)

并且测试数据:

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');
Run Code Online (Sandbox Code Playgroud)

Mar*_*off 43

问题在于您将数据插入表中的方式:+0200语法与SQLite的任何时间格式都不匹配:

  1. YYYY-MM-DD
  2. YYYY-MM-DD HH:MM
  3. YYYY-MM-DD HH:MM:SS
  4. YYYY-MM-DD HH:MM:SS.SSS
  5. YYYY-MM-DDTHH:MM
  6. YYYY-MM-DDTHH:MM:SS
  7. YYYY-MM-DDTHH:MM:SS.SSS
  8. HH:MM
  9. HH:MM:SS
  10. HH:MM:SS.SSS
  11. 现在
  12. 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
Run Code Online (Sandbox Code Playgroud)

如果你在插入格式时绝对无法改变格式,你可能不得不回到做"聪明"的事情并修改实际的字符串(即+用a 替换.等等).


(原始答案)

您尚未描述CREATED_AT列中包含的数据类型.如果确实是日期时间,它将与字符串正确比较:

sqlite> SELECT DATETIME('now');
2010-05-28 16:33:10
sqlite> SELECT DATETIME('now') < '2011-01-01 00:00:00';
1
Run Code Online (Sandbox Code Playgroud)

如果它存储为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
Run Code Online (Sandbox Code Playgroud)

如果这些都没有解决你的问题(即使他们这样做了!)你应该总是发布一些数据,以便其他人可以重现你的问题.您甚至可以随意提出仍然可以重现问题的原始数据的子集.