16

我有点假设它是一个字符串,所以我将它作为一个字符串进行比较,但并不奇怪它失败了。我相信这就是它在 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';

(增加空间以便于查看)

4

3 回答 3

37

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”转换为“1:06am Eastern 6/4/2012”。)

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

于 2012-06-04T05:09:48.923 回答
6

Sqlite 不能直接比较日期。我们需要在几秒钟内转换它们以及整数。

例子

SELECT * FROM Table  
WHERE  
CAST(strftime('%s', date_field)  AS  integer) <=CAST(strftime('%s', '2015-01-01')  AS  integer) ;
于 2015-09-08T12:05:11.643 回答
3

SQLite 版本 3 中的数据类型

1.2 日期和时间数据类型

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

  • TEXT作为 ISO8601 字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
  • REAL作为儒略日数字,根据预测的公历,自公元前 4714 年 11 月 24 日格林威治中午以来的天数。
  • INTEGER作为 Unix 时间,自 1970-01-01 00:00:00 UTC 以来的秒数。

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

如果您查看Date And Time Functions中的示例,这样的事情应该会让您接近您想要的(我假设是当天的 6:00):

WHERE b.start_time = date('now', 'start of day', '+6 hours')
于 2012-06-04T04:09:13.713 回答