SQL 在日期之间进行选择

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

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

此语句获取所有日期,甚至包括标准之外的日期。您看到输入的日期格式与我返回的格式相同。我不知道怎么了。

130857 次浏览

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

将数据更改为该格式以使用 Sqlite 日期时间格式

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'

在 SQLite 中选择日期的另一种方法是使用强大的 时间函数:

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

但如果你想要更多选择,你有的。

或者可以使用 约会函数将字符串强制转换为 Date 格式。甚至日期也以 TEXT 形式存储在数据库中。 像这样(最可行的变体) :

SELECT * FROM test WHERE date(date)
BETWEEN date('2011-01-11') AND date('2011-08-11')
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()

特别感谢 杰夫电子烟男你的互动是真正令人鼓舞的。

下面是一个更复杂的语句,当’/’之间的长度未知时,它很有用:

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

SQLite 没有日期的概念。它只知道它们是短信。在 SQLite 中执行此操作时,实际上是在进行字符串比较。你可以从 正式文件阅读更多。

当比较两个 TEXT 值时,使用适当的排序序列来确定结果。

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

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

将变量放在 Where 条件中,并使用‘ BETWEEN WEEN’解析两个日期:

SELECT * FROM emp_master

- > 如果有像 dd/mm/yyyy simple 这样的日期格式,

   WHERE joined_date BETWEEN '01/03/2021' AND '01/09/2021';

如果你有像 yyyy/mm/dd 这样的日期格式,

   WHERE joined_date BETWEEN '2021/03/01' AND '2021/09/01';

完成代码。

假设你正在为某个报告准备数据,那么整个考验看起来就和这个差不多。

--add column with date in ISO 8601
ALTER TABLE sometable ADD COLUMN DateInISO8601;


--update the date from US date to ISO8601 date
UPDATE sometable
SET DateInISO8601 = substr([DateInUSformat],length([DateInUSformat])+1, -4)
|| '-' ||
substr('00' || [DateInUSformat],instr('00' || [DateInUSformat],'/'),-2)
|| '-' ||
substr('00' || rtrim(substr([DateInUSformat],instr([DateInUSformat],'/')+1,2),'/'),-2,2);


SELECT DateInISO8601
FROM sometable
WHERE DateInISO8601 BETWEEN '2022-02-02' AND '2022-02-22';

你当然可以做到这一切的飞行,但如果你有选择——不要。默认情况下使用 ISO 日期,并在进出 SQLiteDB 时将其转换为。