Oracle sql未读取整个字符串



我有一个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比做字符串比较更好

相关内容

  • 没有找到相关文章

最新更新