我必须通过传递日期从数据库中选择所有行。例如获取所有有日期的行10/23/2012
在sqlite db中,我将其存储在DATE
列中:
01/01/1900 11:00:00 AM
我试图通过使用来获得,date()
但我什么也没得到:
select itemId, date(dateColumn) from items
所以我只需要比较日期,但在sqlite中找不到如何做到这一点。
首先,将您的日期格式化为 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 唯一识别的格式。
在 SQLite 中,没有 datatype DATE
,它存储为字符串。因此,字符串必须完全匹配才能相等。
由于我们不希望这样,您需要将日期列中的值“转换”为伪日期,并将您的参数转换为伪日期,以便可以比较它们:
SELECT itemId FROM items WHERE date(dateColumn) = date("2012-10-22");
请注意,日期命令采用格式为 的日期,如对此较早问题YYYY-MM-DD
的回答中进一步解释。该问题还表明您可以使用-command 来获取日期,匹配一个范围。BETWEEN x AND y
SELECT itemId,dateColumn FROM items WHERE dateColumn=date('YYYY-MM-DD HH:MM:SS');
从 dateColumn = @date 的项目中选择 itemId,dateColumn