SQLite DateTime比较


116

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

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

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

更新:字段mydate是DateTime数据类型


1
mydate列中存储的值是什么日期格式?我猜它不是SQLite支持的格式之一:sqlite.org/lang_datefunc.html
OMG Ponies,2009年

1
天哪,它是一个日期时间数据类型
Brad

4
使用datetime()会得到您提供的确切值,这里没有理由使用它:只需使用字符串即可。如果仅处理日期,则应删除零时部分-基本上确保双方的格式相同。(否则'2009-11-13',对于mydate而言,将小于'2009-11-13 00:00:00'。)

1
为了使带有SQLite的Visual Studio能够对我运行日期/时间查询,我需要使用Datetime()@Brad在他提到的解决方案中所提到的。否则VS2012抱怨。谢谢布拉德。
CapliBli 2013年

感谢您使用解决方案进行更新。.NET中日期的默认格式实际上导致“ <”和“>”相反的事实是多么奇怪。
戴夫·弗里德尔

Answers:


56

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

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


10
对于那些读第一句话,'17 SQLite的确实有datedatetime
alisianoi

3
昨天在这里阅读有关类型相似性的信息:sqlite.org/datatype3.html基本上,如果需要日期,可以在内部将声明为date(或datetime)列text。这符合我的需求。
alisianoi

99

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

一直很简单。您可能只需要编写一个解析器来处理用户如何输入日期,以便将其转换为YYYYMMDD


2
如果格式是标准化的,那么YYYY-MM-DD与没有破折号会有什么不同?比较会不会一样?
戴蒙

2
@Damon:我认为他使用int表示数据类型
thumbmunkeys 2011年

1
不,这些是字符串-您可以在引号中看到它-但这是个好主意:使用YY MM DD顺序,可以比较日期。@Damon它也应该与破折号一起使用!
Sedat Kilinc

1
我想知道如果我使用yyyyMMddHHmmss格式来存储是否可以做同样的事情,那么我也可以包括时间部分。会导致溢出或其他原因吗?
faizal

2
我使用:yyyyMMddHHmm没问题,我希望yyyyMMddHHmmss可以正常工作
Steve Byrne

39

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

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

%s必须放在单引号字符之间,即:strftime('%s',date)
mvladic 2012年

有用。修改解决方案以选择特定日期之后的所有行:SELECT * FROM table WHERE strftime('%s',添加)> strftime('%s',“ 2017-01-01 00:00:00”)
新程序

我正在strftime像本例中那样在WHERE子句中进行评估,但我有一个问题:strftime像这样使用是否有效?是对每一行评估一次还是对每个查询评估一次?
Alvaro Gutierrez Perez

这应该被接受为正确答案!
Luka Sh

20

以下内容对我使用SQLite的工作正常:

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

这在iOS,Objective-C中为我工作,我的查询如下:从cars_sales_tbl中选择COUNT(carSold),“ 2015-04-01”和“ 2015-04-30”之间的日期,
以及carType

9

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

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


6

我遇到的情况是,我希望从两天前直到今天结束之前获取数据。我到达以下。

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')

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

情况会好一些。它仍然没有考虑leap秒,其中一个小时实际上可以超过60秒,但是足以用于此处的讨论了:)


2

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

"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

2

以下是比较日期的方法,但在此之前,我们需要确定存储在数据库中的日期格式

我的日期以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. 下面的查询将使用大于运算符(>)。

      select * from myTable where myColumn > strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day');  

我所做的所有计算都是使用当前时间,您可以根据需要更改格式和日期。

希望这个能对您有所帮助

总结


1

您也可以编写自己的用户函数,以选择的格式处理日期。SQLite有一个相当简单的方法来编写您自己的用户函数。例如,我写了一些将持续时间加在一起。


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开发的人也能从这个答案中受益!


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查询。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.