当前位置:  开发笔记 > 前端 > 正文

如何比较sqlite TIMESTAMP值

如何解决《如何比较sqliteTIMESTAMP值》经验,为你挑选了1个好方法。

我有一个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

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



1> Mark Rushako..:

问题在于您将数据插入表中的方式:+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

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

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有