我有一个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');
答案 0 :(得分:41)
问题在于您将数据插入表格的方式:+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
如果你在插入格式时绝对无法改变格式,你可能不得不回到做“聪明”的事情并修改实际的字符串(即用{{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。 但是,在许多应用程序中,简单地不包括现有答案所建议的时区可能更容易。