我有一个oracle sql查询来获取从2021年5月18日到"2021年5日28日"的日期。
由于某些原因,斜线后的值不会被读取,因为第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
当人们将日期值存储为字符串时,就会发生这种情况。
看看这是否有帮助:
AND to_date(datadate, 'dd/mm/yyyy') between to_date('18/05/2021', 'dd/mm/yyyy')
and to_date('28/05/2021', 'dd/mm/yyyy')
您不必重新开始,只需将数据移动到日期时间列即可
ALTER TABLE t ADD x DATE;
UPDATE t SET x = to_date(concat(datadate,datatime), 'dd/mm/yyyyhh24:mi:ss'))
WHERE datadate in (SELECT to_char(to_date('1999-12-31', 'yyyy-mm-dd') + level, 'dd/mm/yyyy') FROM dual CONNECT BY level <= 10000)
WHERE子句应该生成一个从2000年到2030年的有效日期列表——如果您的日期在这个范围之外,则相应地调整
现在应该能够找到无效日期(它们不是where子句的一部分,因此x应该保持为空(并手动修复:
SELECT * FROM t WHERE x is null
然后删除您的datadate和datatime列,并将x重命名为datadatetime
现在像BETWEEN这样的查询可以正常工作,如果你只需要日期部分,你可以做TRUNC(x(。(你甚至可以将TRUNC改为其他日期部分,如小时,缩短分秒,或一年中的一周,将日期四舍五入到一周的开始等(如果你只需要时间,你可以做x - TRUNC(x)
,它给出一个十进制数字,比如中午12点0.5,下午6点0.75,或者你可以根据你想做的事情进行TOCHAR。做x -TRUNC(x) BETWEEN 9.0/24.0 AND 17.0/24.0
比做字符串比较更好