【发布时间】:2021-08-22 04:11:26
【问题描述】:
我有一个 oracle sql 查询来获取从 18/05/2021 到“28/05/2021”的日期。
由于某些原因,斜线后面的值没有被读取,因为第 4 个月的值也被输出了。我不知道我错在哪里。如果可以的话,请帮忙,非常感谢您的宝贵时间。
注意:日期已使用 varchar 数据类型存储在数据库中。
SELECT datadate
FROM mytable
WHERE trailerid= '1' and datattime>'05:00:00' and datattime<'12:00:00'
AND datadate between '18/05/2021' and '28/05/2021'
GROUP BY datadate ORDER BY datadate;
电流输出
DATADATE
----------------
18/05/2021
19/04/2021
19/05/2021
20/05/2021
21/04/2021
21/05/2021
22/04/2021
22/05/2021
23/04/2021
23/05/2021
24/04/2021
24/05/2021
25/04/2021
25/05/2021
26/04/2021
26/05/2021
27/04/2021
27/05/2021
28/04/2021
28/05/2021
【问题讨论】:
-
这种格式的日期没有顺序,因为要比较日期,您需要先比较年,然后是月,然后是天。这部分在你的字符串中的顺序是不同的
-
我不知道我错在哪里 - 就在您所说的部分附近:日期已使用 varchar 数据类型存储在数据库中 ——不,不,不,不,不。解决这个根本问题,这个后果就会永远消失
-
嘿,谢谢,我想尝试这个的原因是我在该列中有大量数据。现在看来我必须重新开始。感谢您的回答
-
如果您要坚持将日期存储为字符串,至少将它们存储在 yyyy-mm-dd 以便 BETWEEN 工作。您抱怨
BETWEEN '18/05..' AND '28/05..'返回 04 日期,但是字符串19/04..确实介于“M/A”在“L/Y”和“Z/Z”之间,即使 A 不在 Y 和 Z 之间!老实说,添加另一个日期时间类型的列,将数据复制到其中,删除旧列并将新列重命名为旧列,大约需要 5 分钟。此外,奖金,您的新闪亮 DATETIME 列也可以存储数据时间的内容。 -
将日期存储为字符串也会弄乱优化器统计数据,可能导致错误的执行计划