如何比较sqlite TIMESTAMP值

时间:2010-05-28 16:30:05

标签: sql sqlite timestamp

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

SELECT * FROM logged_event WHERE logged_event.CREATED_AT < '2010-05-28 16:20:55'

及其各种变体,与日期功能一样。我已阅读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)
);

测试数据:

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');

3 个答案:

答案 0 :(得分:41)

问题在于您将数据插入表格的方式:+0200语法与SQLite's time formats中的任何一个都不匹配:

  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
  13. 更改它以使用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
    

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


    (原始答案)

    您尚未说明.列中包含哪种数据。如果确实是日期时间,它将与字符串正确比较:

    CREATED_AT

    如果它存储为unix时间戳,则需要使用第二个参数sqlite> SELECT DATETIME('now'); 2010-05-28 16:33:10 sqlite> SELECT DATETIME('now') < '2011-01-01 00:00:00'; 1 调用DATETIME函数以与字符串进行比较:

    'unixepoch'

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

答案 1 :(得分:1)

SQLite对日期/时间类型的支持非常有限。您可能需要使用自己的方法来维护时间信息。至少,这就是我所做的。

您可以使用SQLite create_function()API定义自己的存储函数以进行比较。

答案 2 :(得分:0)

我可以说,包含时区说明符是完全合理的;看到文字&#34;格式2到10可以。 。 &#34;在http://www.sqlite.org/lang_datefunc.html 但是,问题是只有日期函数将时间戳解释为日期。因此,对于实际比较,您需要通过日期函数传递时间戳或存储字符串比较工作的内容。 一种方法是对应用程序进行编码,以便在插入的每个值和select语句中的每个文字值上调用datetime。 但是,在许多应用程序中,简单地不包括现有答案所建议的时区可能更容易。