6

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

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

01/01/1900 11:00:00 AM

我试图通过使用来获得,date()但我什么也没得到:

select itemId, date(dateColumn) from items

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

4

4 回答 4

9

首先,将您的日期格式化为 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 唯一识别的格式。

于 2012-10-22T22:23:55.987 回答
5

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

由于我们不希望这样,您需要将日期列中的值“转换”为伪日期,并将您的参数转换为伪日期,以便可以比较它们:

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

请注意,日期命令采用格式为 的日期,如对此较早问题YYYY-MM-DD的回答中进一步解释。该问题还表明您可以使用-command 来获取日期,匹配一个范围。BETWEEN x AND y

于 2012-10-22T22:24:17.553 回答
0
SELECT itemId,dateColumn FROM items WHERE dateColumn=date('YYYY-MM-DD HH:MM:SS');

SQLite 参考

于 2012-10-22T22:12:22.440 回答
0

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

于 2012-10-22T22:17:42.387 回答