SQLite DateTime比较

时间:2009-12-29 17:12:57

标签: sql sqlite

我似乎无法通过使用日期时间字符串作为比较对sqlite数据库的查询获得可靠的结果:

select * 
  from table_1 
 where mydate >= '1/1/2009' and mydate <= '5/5/2009'

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

更新: field mydate是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')

12 个答案:

答案 0 :(得分:94)

要解决此问题,我将日期存储为YYYYMMDD。从而,    where mydate >= '20090101' and mydate <= '20050505'

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

答案 1 :(得分:53)

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

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

答案 2 :(得分:31)

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

SELECT * FROM table WHERE 
    strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)

答案 3 :(得分:18)

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

SELECT * 
    FROM ingresosgastos 
    WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"

答案 4 :(得分:8)

Sqlite无法比较日期。我们需要转换为秒并将其转换为整数。

实施例

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

答案 5 :(得分:4)

以下为我工作。

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

答案 6 :(得分:2)

以下是比较日期的方法,但在此之前我们需要确定存储在DB

中的日期格式

我将日期存储为MM / DD / YYYY HH:MM格式,因此必须以该格式进行比较

  1. 以下查询比较将日期转换为MM / DD / YYY格式并获取过去五天至今的数据。 BETWEEN运算符将提供帮助,您只需指定开始日期和结束日期。

    select * from myTable where myColumn BETWEEN strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day') AND strftime('%m/%d/%Y %H:%M',datetime('now','localtime')); 
    
  2. 以下查询将使用大于运算符(&gt;)。

      select * from myTable where myColumn > strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day');  
  3. 我所做的所有计算都是使用当前时间,您可以根据需要更改格式和日期。

    希望这会对你有所帮助

    Summved

答案 7 :(得分:2)

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

WHERE dateTimeRecorded between date('now', 'start of day','-2 days') 
                           and date('now', 'start of day', '+1 day') 

好的,从技术上来说,如果有任何数据,我也会像明星一样在明天午夜拉,但我的数据都是历史性的。

要记住的关键事项是,最初的海报排除了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')

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

本来会好一些。它仍然没有考虑到一个小时实际上可以超过60秒的闰秒,但足够讨论这里:)

答案 8 :(得分:1)

您还可以编写your own user functions来处理您选择的格式的日期。 SQLite有一个非常简单的方法来编写自己的用户函数。例如,我写了几个来添加持续时间。

答案 9 :(得分:1)

我必须将时区信息存储在其中,并且能够使用以下格式进行查询:

"SELECT * FROM events WHERE datetime(date_added) BETWEEN 
      datetime('2015-03-06 20:11:00 -04:00') AND datetime('2015-03-06 20:13:00 -04:00')"

时间以以下格式存储在数据库中作为常规TEXT:

2015-03-06 20:12:15 -04:00

答案 10 :(得分:0)

我的查询我做了如下:

SELECT COUNT(carSold) 
FROM cars_sales_tbl
WHERE date
BETWEEN '2015-04-01' AND '2015-04-30'
AND carType = "Hybrid"

我得到了@ ifredy答案的暗示。我所做的就是,我希望使用Objective-C在iOS中运行此查询。它有效!

希望有人进行iOS开发,也可以使用这个答案!

答案 11 :(得分:0)

现在我正在使用System.Data.SQlite NuGet软件包(版本1.0.109.2)进行开发。使用SQLite版本3.24.0。

这对我有用。

SELECT * FROM tables WHERE datetime 
BETWEEN '2018-10-01 00:00:00' AND '2018-10-10 23:59:59';

我不愿意使用datetime()函数。也许他们已经在该SQLite版本上更新了SQL查询。