SQLite 日期时间比较

我似乎不能从使用 datetime 字符串对 sqlite 数据库的查询中获得可靠的结果,比如:

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

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

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

232590 次浏览

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

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

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

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

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

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

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

使用 SQLite,下面的代码可以很好地工作:

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

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

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

时间以常规文本格式储存在数据库中,格式如下:

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

我的问题如下:

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

我从“弗雷迪”的回答中得到了提示。我所做的就是,我想让这个查询在 iOS 中运行,使用 Objective-C。成功了!

希望做 iOS 开发的人也能从这个答案中受益!

Sqlite 不能比较日期。我们需要转换成秒,并强制转换为整数。

例子

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

跟踪对我很管用。

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

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

我有以 MM/DD/YYYY HH: MM 格式存储的日期,因此必须以这种格式进行比较

  1. 下面的查询将日期转换为 MM/DD/YYY 格式并获取从过去五天到今天的数据。操作符将有所帮助,您可以简单地指定开始日期和结束日期。

    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. Below query will use greater than operator (>).

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

All the computation I have done is using current time, you can change the format and date as per your need.

Hope this will help you

Summved

我有一个情况,我希望数据从两天前到今天结束。 我得出了以下结论。

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

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

关键是要记住,最初的海报排除了2009-11-1500: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秒,但对于这里的讨论来说已经足够了:)

现在我正在使用 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 ()函数。

下面是 C # 中的一个工作示例,它有三种方式:

  string tableName = "TestTable";


var startDate = DateTime.Today.ToString("yyyy-MM-dd 00:00:00"); \\From today midnight
var endDate = date.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss"); \\ Whole day


string way1 /*long way*/ = $"SELECT * FROM {tableName} WHERE strftime(\'%s\', DateTime)
BETWEEN strftime('%s', \'{startDate}\') AND strftime('%s', \'{endDate}\')";
  

string way2= $"SELECT * FROM {tableName} WHERE DateTime BETWEEN \'{startDate}\' AND \'{endDate}\'";


string way3= $"SELECT * FROM {tableName} WHERE DateTime >= \'{startDate}\' AND DateTime <=\'{endDate}\'";