SQLite,基于日期进行查询

4

我一直在搜索如何做到这一点,但没有得到清晰的答案(也许我的资源不够好)。我需要从SQLite数据库中进行查询,以检索两个日期之间的数据。

我正在尝试以下操作:

SELECT CONTACTNAME
FROM SHIPMENT 
WHERE DATECREATED 
BETWEEN date('11-15-2010') 
AND date('12-25-2010');

数据以以下形式存储在我的SQLite数据库中:
CONTACTNAME=VARCHAR
DATECREATED=date (format: "11/22/2010")
3个回答

16

SQLite没有日期类型。您可以将日期存储为字符串,但需要使用YYYY-MM-DD日期顺序,而不是 MM-DD-YYYY。这有两个主要原因:

(1)正确的排序

使用YYYY-MM-DD日期,词典顺序与时间顺序相同,这使得<>BETWEEN操作符按预期工作。

这对于MM-DD-YYYY日期不适用。查询日期BETWEEN '11-15-2010' AND '12-25-2010'会错误匹配'11-22-1963''12-21-2012'

(2)与SQLite日期和时间函数兼容性。

它们接受字符串和数字(朱利安)日期,但如果您向其中任何一个函数传递字符串,则必须具有YYYY-MM-DD顺序。


4

尝试只删除date():

SELECT CONTACTNAME
FROM SHIPMENT 
WHERE DATECREATED 
BETWEEN '2010-11-15' 
AND '2010-12-25'

啊,好的,谢谢。不确定为什么我阅读的教程中有那个内容。 - Rick
@dan04,你能澄清一下“那个”吗?我在自己的SQLite数据库上尝试了上面使用的代码,使用了MM-DD-YYYY的日期顺序,所以想知道你是指date()函数还是SQLite的不同版本可能与其他读者阅读这个问题有关 :) - Ethel Evans
1
它只在yyyy-MM-dd格式下正常工作。请查看dan04的答案。 - naveen
1
谢谢你的更正,真是尴尬……不幸的是,我好像无法删除我的帖子,因为它已被接受 :-( 有没有其他 Stack Overflow 用户知道如何解决这个问题? - Ethel Evans

2
SELECT field_1,field_2,date_field
 WHERE julianday(date_field)
 BETWEEN julianday('1998-01-01') and julianday('2008-01-01');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接