如何在SQLite中比较两个日期?

And*_*ndy 13 sqlite

我有点认为它是一个字符串,所以我将它作为一个字符串进行比较,但毫不奇怪它失败了.我相信它在Mysql中是如何工作的.我可能错了,因为我有一段时间没有参与其中.在任何一种情况下,如何检查SQLite中的日期是否相等?我将在WHERE子句中使用它.

SELECT a._id, b._id, b.start_date,a.event_name, b.start_time, 
b.end_date, b.end_time, b.location FROM events_info b INNER JOIN events a ON
 a._id=b.event_id WHERE b.start_time = '6:00';
Run Code Online (Sandbox Code Playgroud)

(增加了空间,使其更容易看)

Kin*_*pus 32

SQLite没有专用的DATETIME类型.通常人们做的是确保将日期存储为一致的格式化字符串; 例如,YYYY-MM-DD hh:mm:ss.如果您这样做,只要您保持一致,那么您可以直接比较日期:

SELECT * FROM a WHERE q_date < '2013-01-01 00:00:00';
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为即使比较在技术上是字母比较而不是数字比较,也可以按照字母顺序和数字顺序排列一致的格式.

对于这样的模式,我建议以24小时格式存储日期(上面的例子是午夜).用零填充月,日和小时.如果您的日期将跨越多个时区,请将它们全部存储在UTC中,并进行客户端所需的任何转换,以将它们转换为本地时区.

通常,日期和时间都存储在一列中.如果您因任何原因必须将它们分开,只需确保日期一致并且您的时间都是一致的.例如,日期应该都是YYYY-MM-DD,时间应该都是hh:mm:ss.

YYYY-MM-DD hh:mm:ss是首选​​格式的原因是因为当您从最大日期间隔(年)到最小(秒)时,您可以非常轻松地对其进行索引和排序,并且具有高性能.

SELECT * FROM a WHERE q_date = '2012-06-04 05:06:00';
Run Code Online (Sandbox Code Playgroud)

会使用索引来磨练日期/时间而不必进行全表扫描.或者如果它们分成两行:

SELECT * FROM a WHERE q_date = '2012-06-04' AND q_time = '05:06:00';
Run Code Online (Sandbox Code Playgroud)

关键是要确保日期和时间以一致的格式进入数据库.对于用户友好的演示,请在客户端进行所有转换,而不是在数据库中进行.(例如,将'2012-06-04 05:06:00'转换为"东部2012年6月4日上午1:06".)

如果这不回答问题,您能否发布您用于存储日期和时间的确切格式,以及您尝试比较的两个示例日期,这些日期与您预期的方式不同?


Har*_*ngh 6

Sqlite 不能直接比较日期。我们需要以秒为单位转换它们以及整数。

例子

SELECT * FROM Table  
WHERE  
CAST(strftime('%s', date_field)  AS  integer) <=CAST(strftime('%s', '2015-01-01')  AS  integer) ;
Run Code Online (Sandbox Code Playgroud)