如何在sqlite中按日期选择行

时间:2012-10-22 22:05:58

标签: sql database sqlite

我必须通过传递日期来从数据库中选择所有行。例如,获取日期为10/23/2012

的所有行

sqlite db 中,我将其存储在DATE列中:

01/01/1900 11:00:00 AM

我试图使用date(),但我没有得到任何日期:

select itemId, date(dateColumn) from items

所以我只需要比较日期,但无法在sqlite中找到如何做到这一点。

4 个答案:

答案 0 :(得分:5)

首先,将日期格式设置为ISO-8601标准。将其包装在Date()中以确保将其作为DATE处理。最后,构建您的范围,以便包括从凌晨12:00开始到第二天凌晨12:00之前的所有内容。

select itemId, dateColumn
from items
where dateColumn >= date('2012-10-23')
  AND dateColumn <  date('2012-10-23', '+1 day')

未键入SQLite列。但是,如果将列与DATE进行比较,如图所示,将列数据强制转换为日期就足够了(如果不是可强制的话,则为null),并且比较将正常工作。

SQLFiddle上的示例:

create table items (
  itemid, datecolumn);
insert into items select
  1,'abc' union all select
  2,null union all select
  3,'10/23/2012 12:23' union all select
  4,'10/23/2012' union all select
  5,'2012-10-23 12:23' union all select
  6,'2012-10-23' union all select
  7,'2012-10-24 12:23' union all select
  8,'2012-10-24' union all select
  9,date('2012-10-24 12:23') union all select
  10,date('2012-10-24');

结果:

itemid  datecolumn
5       2012-10-23 12:23
6       2012-10-23

请注意,虽然第3行和第4行 显示 是日期,但它们不是,因为它们不符合ISO-8601格式,这是唯一可识别的格式SQLite的。

答案 1 :(得分:4)

在SQLite中,没有数据类型DATE,它存储为字符串。因此,字符串必须与完全匹配才能相等。

由于我们不希望这样,你需要将值从“日期 - 列”“转换”为伪日期,并将你的参数转换为伪日期,因此可以对它们进行比较:

SELECT itemId FROM items WHERE date(dateColumn) = date("2012-10-22");

请注意,date-command将日期格式化为YYYY-MM-DD,如this older question的答案中所述。问题还表明,您可以使用BETWEEN x AND y - 命令获取匹配范围的日期。

答案 2 :(得分:0)

SELECT itemId,dateColumn FROM items WHERE dateColumn=date('YYYY-MM-DD HH:MM:SS');

SQLite Reference

答案 3 :(得分:0)

从项目中选择itemId,dateColumn 其中dateColumn = @date