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

19

我有点默认它是一个字符串,所以我把它作为字符串进行比较,但不出所料地失败了。我认为这就是在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';

(添加空格使其更易于查看)


1
你应该发布你的“不起作用”的代码。 - Sudhir Bastakoti
我认为这个问题的根源在于时间/日期比较,所以我不太明白为什么要这样做。但如果这很重要,我很乐意配合。对此我深表歉意。 - Andy
“比较两个日期”是指“比较两个时间点”,对吗? - mu is too short
好的先生。时间可以分开,例如YYYY-MM-DD和HH:MM,但不管你决定如何帮助我都可以。 - Andy
3个回答

42

SQLite没有专门的DATETIME类型。通常人们会将日期存储为一个格式化的字符串,比如说YYYY-MM-DD hh:mm:ss。如果你这样做了,并且保持一致,那么你可以直接比较日期:

SELECT * FROM a WHERE q_date < '2013-01-01 00:00:00';

这段代码能够工作是因为虽然比较实际上是按字典顺序而不是数字顺序进行的,但是像这样格式一致的日期也可以按照字典和数字顺序排序。

对于这种模式,建议以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';

使用索引可以针对日期/时间进行精确查询,而不必执行完整表扫描。或者如果它们分别在两个行中:

SELECT * FROM a WHERE q_date = '2012-06-04' AND q_time = '05:06:00';

关键是确保日期和时间在进入数据库前处于一致的格式。为了用户友好的呈现,所有转换都应该在客户端完成,而不是在数据库中完成。(例如,将“2012-06-04 05:06:00”转换为“Eastern时间6/4/2012上午1:06”)。

如果这不能解答您的问题,请提供您存储日期和时间使用的确切格式以及两个示例日期,这些日期的比较结果与您期望的不同。


这是真的。但是在数据库中设置类型有什么意义呢,哈哈。它只会让我感到困惑,因为它允许人们创建日期和时间列,但当进行比较时,却失败了。但我可以只创建一个文本列。谢谢。 - Andy
1
说实话,这样做是为了可移植性。这样,如果你从SQLite转移到其他数据库系统,或者反过来,你就不必重写所有的查询语句。或者至少,这样做会更容易些。 - King Skippus
1
我的工作代码:SELECT * FROM LogDetail WHERE time_Detail > '2014-06-18 23:13:00'; 谢谢,你救了我的一天 :) - pkc456

7

Sqlite无法直接比较日期。我们需要将它们转换为秒数和整数。

例子

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

4

来自SQLite版本3中的数据类型:

1.2 日期和时间数据类型

SQLite没有专门用于存储日期和/或时间的存储类。相反,SQLite内置的日期和时间函数能够将日期和时间存储为TEXT、REAL或INTEGER值:

  • TEXT格式为ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
  • REAL格式为儒略日数,即格林威治时间1970年1月1日12:00以来的天数。
  • INTEGER格式为Unix时间,即1970-01-01 00:00:00 UTC以来的秒数。

应用程序可以选择使用这些格式中的任何一种存储日期和时间,并使用内置的日期和时间函数自由地在格式之间进行转换。

如果您查看日期和时间函数中的示例,像这样的内容应该可以让您接近想要的结果(我假设您想要的是当前日期的6:00):

WHERE b.start_time = date('now', 'start of day', '+6 hours')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接