SQLite DateTime比较

Bra*_*rad 112 sql sqlite

我似乎无法从使用日期时间字符串作为比较的sqlite数据库的查询中获得可靠的结果,如下所示:

select * 
  from table_1 
 where mydate >= '1/1/2009' and mydate <= '5/5/2009'
Run Code Online (Sandbox Code Playgroud)

我该如何处理与sqlite的日期时间比较?

update:field mydate是DateTime数据类型

解:

遵循datetime函数并具有字符串格式为YYYY-MM-DD HH:mm:ss我取得了如下良好的结果,如下所示

select * 
  from table_1 
  where mydate >= Datetime('2009-11-13 00:00:00') 
  and mydate <= Datetime('2009-11-15 00:00:00')
Run Code Online (Sandbox Code Playgroud)

小智 96

为了解决这个问题,我将日期存储为YYYYMMDD.从而, where mydate >= '20090101' and mydate <= '20050505'

它只是简单的工作.您可能只需要编写一个解析器来处理用户输入日期的方式,以便将它们转换为YYYYMMDD.

  • 如果格式是标准化的,那么YYYY-MM-DD如何与没有短划线的情况有所不同?不会比较结果一样吗? (2认同)
  • @Damon:我认为他对数据类型使用int (2认同)
  • 不,这些是字符串 - 您可以在引号中看到它 - 但这是个好主意:使用 **YY MM DD** 这个顺序可以比较日期。@Damon 它也应该与破折号一起使用! (2认同)
  • 我使用:yyyyMMddHHmm没问题,我希望yyyyMMddHHmmss能够同样工作 (2认同)

小智 56

SQLite没有专用的日期时间类型,但确实有一些日期时间函数.遵循那些函数理解的字符串表示格式(实际上只有格式1-10)(将值存储为字符串)然后你可以使用它们,加上字符串上的词典比较将匹配日期时间比较(只要你不这样做)尝试将日期与时间或日期时间进行比较,这无论如何都没有多大意义.

根据您使用的语言,您甚至可以获得自动转换.(这不适用于SQL语句中的比较,例如示例,但会让您的生活更轻松.)

  • 对于阅读第一句话的所有人来说,在'17 SQLite确实有'date`和`datetime` (6认同)
  • 3.5 年后,当我读到 https://www.sqlite.org/datatype3.html 时:“SQLite 没有为存储日期和/或时间预留的存储类”=) (5认同)
  • 昨天在这里阅读有关类型相似性的信息:https://www.sqlite.org/datatype3.html基本上,如果您需要日期,则可以在该列中声明一个“日期”(或“日期时间”),该列在内部被视为“文字`。这符合我的需求。 (2认同)

小智 35

我最近遇到了同样的问题,我解决了这个问题:

SELECT * FROM table WHERE 
    strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)
Run Code Online (Sandbox Code Playgroud)

  • 这里的“date”、“start_date”和“end_date”是什么类型? (2认同)

小智 19

以下对我来说使用SQLite很好:

SELECT * 
    FROM ingresosgastos 
    WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"
Run Code Online (Sandbox Code Playgroud)


Har*_*ngh 8

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)


小智 8

我有一种情况,我需要最多两天前到今天结束的数据。我到达了以下。

WHERE dateTimeRecorded between date('now', 'start of day','-2 days') 
                           and date('now', 'start of day', '+1 day') 
Run Code Online (Sandbox Code Playgroud)

好吧,技术上我也像原始海报一样在明天午夜拉,如果有任何数据,但我的数据都是历史数据。

要记住的关键是,最初的海报排除了 2009-11-15 00:00:00 之后的所有数据。因此,包括在 15 日午夜记录的任何数据,但不包括15 日午夜之后的任何数据。如果他们的查询是

select * 
  from table_1 
  where mydate between Datetime('2009-11-13 00:00:00') 
                   and Datetime('2009-11-15 23:59:59')
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,使用 between 子句。

它会稍微好一点。它仍然没有考虑闰秒,其中一个小时实际上可以超过 60 秒,但足以在这里讨论:)


小智 6

以下对我有用。

SELECT *
FROM table_log
WHERE DATE(start_time) <= '2017-01-09' AND DATE(start_time) >= '2016-12-21'
Run Code Online (Sandbox Code Playgroud)