SQL在日期之间选择

时间:2011-11-18 18:31:46

标签: sql sqlite

我正在运行sqlite来为销售报告选择两个范围之间的数据。要从两个日期之间选择数据,我使用以下语句:

SELECT * FROM test WHERE date BETWEEN "11/1/2011" AND "11/8/2011";

此声明会抓取所有日期,即使是那些超出标准的日期。您看到输入的日期格式与我返回的格式相同。我不确定什么是错的,但感谢我能找到的任何帮助。谢谢!

7 个答案:

答案 0 :(得分:84)

SQLite要求日期为YYYY-MM-DD格式。由于数据库中的数据和查询中的字符串不是那种格式,因此可能会将“日期”视为字符串。

答案 1 :(得分:28)

将您的数据更改为格式以使用sqlite datetime formats

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'

答案 2 :(得分:12)

在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', ...)

但是如果你想要更多的选择,你就拥有它。

答案 3 :(得分:4)

或者您可以使用日期功能将字符串转换为日期格式。甚至日期也作为TEXT存储在DB中。 像这样(最可行的变体):

SELECT * FROM test WHERE date(date) 
BETWEEN date('2011-01-11') AND date('2011-8-11')

答案 4 :(得分:3)

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()

希望这会对你有所帮助。

答案 5 :(得分:1)

特别感谢Jeffvapcguy您的互动性非常令人鼓舞。

当'/'之间的长度为unknown ::

时,这是一个更复杂的语句
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') 

答案 6 :(得分:0)

SQLite 没有日期的概念。它只知道它们是文本。当您在 SQLite 中执行此操作时,您实际上是在进行字符串比较。您可以从 official documentation 中阅读更多内容。

<块引用>

当比较两个 TEXT 值时,会使用适当的整理顺序来确定结果。

填充日期的任何数字(即,不使用像“May”这样的词)格式以及从最大字段到最小字段的顺序都可以使用。 “2021-05-07”(5 月 7 日)在“2021-05-09”(5 月 9 日)之前。因此,如果您使用“yyyy-mm-dd”格式,那么您将被设置。 "yyyy/mm/dd" 和 "yyyymmdd" 也工作得很好。 (有关“可排序”日期格式的更好措辞,请查看 RFC 3339 section 5.1。)

使用“yyyy-mm-dd”格式的一个原因是因为这是 SQLite 的内置 date 使用的格式。