我正在运行sqlite以选择两个范围之间的数据作为销售报告。要从两个日期之间选择数据,我使用以下语句:
SELECT * FROM test WHERE date BETWEEN "11/1/2011" AND "11/8/2011";
该语句将获取所有日期,甚至超出条件的日期。您输入的日期格式与我输入的日期格式相同。我不确定发生了什么问题,但感谢您能找到的任何帮助。谢谢!
Answers:
SQLLite要求日期采用YYYY-MM-DD
格式。由于数据库中的数据和查询中的字符串不是这种格式,因此可能会将“日期”视为字符串。
BETWEEN '2011-11-01' AND '2011-11-02'
。
将数据更改为该格式以使用sqlite datetime格式。
YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
YYYY-MM-DDTHH:MM
YYYY-MM-DDTHH:MM:SS
YYYY-MM-DDTHH:MM:SS.SSS
HH:MM
HH:MM:SS
HH:MM:SS.SSS
now
DDDDDDDDDD
SELECT * FROM test WHERE date BETWEEN '2011-01-11' AND '2011-08-11'
MM/DD/YYYY
格式,我怀疑这仍然行不通,因为他数据库中的数据将被视为字符串而非日期。
在SQLite中选择日期的另一种方法是使用强大的strftime函数:
SELECT * FROM test WHERE strftime('%Y-%m-%d', date) BETWEEN "11-01-2011" AND "11-08-2011"
根据https://sqlite.org/lang_datefunc.html,这些等效:
date(...)
strftime('%Y-%m-%d', ...)
但是如果您想要更多选择,就可以选择。
SELECT *
FROM TableName
WHERE julianday(substr(date,7)||'-'||substr(date,4,2)||'-'||substr(date,1,2)) BETWEEN julianday('2011-01-11') AND julianday('2011-08-11')
请注意,我使用以下格式: dd/mm/yyyy
如果您使用d / m / yyyy,请在 substr()
希望这会帮助你。
julianday()
,虽然您不需要使用,并且使用时假设您的日期采用UTC,因为它是julianday()
根据基于GMT的时间进行计算的,因此最终可以包含不需要的日期,以及可以执行的日期,如果您的日期是当地时间。您应该能够做到SELECT * FROM TableName WHERE substr(date,7)||'-'||substr(date,4,2)||'-'||substr(date,1,2) BETWEEN '2011-01-11' AND '2011-08-11'
,并且应该可以工作。
这是一个更复杂的语句,当'/'之间的长度未知时非常有用:
SELECT * FROM tableName
WHERE julianday(
substr(substr(date, instr(date, '/')+1), instr(substr(date, instr(date, '/')+1), '/')+1)
||'-'||
case when length(
substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1),'/')-1)
)=2
then
substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1), '/')-1)
else
'0'||substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1), '/')-1)
end
||'-'||
case when length(substr(date,1, instr(date, '/')-1 )) =2
then substr(date,1, instr(date, '/')-1 )
else
'0'||substr(date,1, instr(date, '/')-1 )
end
) BETWEEN julianday('2015-03-14') AND julianday('2015-03-16')
julianday()
对其他帖子的相同评论仍然适用。这与其他答案基本相同,不同之处在于您输入了条件逻辑以在前几位数的天和月中添加前导零。可能应该已经添加到其他答案中,或用此编辑替换了它。赞成,因为它更正确。