111*_*110 4 sql database sqlite
我必须通过传递日期来从数据库中选择所有行.例如,获取具有日期的所有行10/23/2012
在sqlite db中,我将其存储在DATE列中:
01/01/1900 11:00:00 AM
Run Code Online (Sandbox Code Playgroud)
我试图通过使用,date()但我没有得到任何日期:
select itemId, date(dateColumn) from items
Run Code Online (Sandbox Code Playgroud)
所以我只需要比较日期,但无法在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')
Run Code Online (Sandbox Code Playgroud)
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');
Run Code Online (Sandbox Code Playgroud)
结果:
itemid datecolumn
5 2012-10-23 12:23
6 2012-10-23
Run Code Online (Sandbox Code Playgroud)
请注意,虽然第3行和第4行似乎是日期,但它们不是,因为它们不符合ISO-8601格式,这是SQLite识别的唯一格式.
在 SQLite 中,没有 datatype DATE,它存储为字符串。因此,字符串必须完全匹配才能相等。
由于我们不希望这样,您需要将日期列中的值“转换”为伪日期,并将您的参数转换为伪日期,以便可以比较它们:
SELECT itemId FROM items WHERE date(dateColumn) = date("2012-10-22");
Run Code Online (Sandbox Code Playgroud)
请注意, date-command 将日期格式设置为YYYY-MM-DD,如对此旧问题的回答中的进一步解释。该问题还表明您可以使用BETWEEN x AND y-command 来获取匹配范围的日期。
| 归档时间: |
|
| 查看次数: |
7899 次 |
| 最近记录: |