1.oracle to_date转化问题
今天写了个脚本,判断业务数据在某个区间,例如:
原本是想着筛选2024年之前的,
c.time < to_date('2024','yyyy') -- 实际上 to_date('2024','yyyy') 结果是 2024/10/1
oracle对 to_date('2024','yyyy') 默认处理是 当前年月的第一天。
Oracle中的TO_DATE
函数用于将字符串转换为日期类型。如果你使用TO_DATE('2024','yyyy')
这样的语句,Oracle会尝试将字符串'2024'
按照提供的格式'yyyy'
转换为日期。这个格式看起来没有问题,但是在Oracle中使用TO_DATE
来转换一个四位年份的数字到日期时,你需要提供一个完整的日期格式,包括月份和日期,因为Oracle需要这些信息来构造一个完整的日期。
解决方法:
你需要提供一个月份和日期才能将一个四位年份数字字符串转换为Oracle日期类型。例如,你可以这样写:
SELECT TO_DATE('2024-01-01', 'yyyy-mm-dd') FROM DUAL;
2.oracle的日期对比不正确问题:
以下可以看出,oracle如果有时分秒的date 跟没有时分秒的对比,得出的结果会跟我们的预期不一样,是不正确的。改成 to_char(c.sign_date,'yyyyMMdd') > '20140101' 这样的判断才符合预期。 下面举例:
下面想用一个固定的时间 date1 (2014/1/1)来跟数据库的日期对比,判断通过输出1,否则0;
根据结果,可以看到结果不符合预期,所以数据库的日期比较,需要确认数据类型,带时分秒的日期跟 不带时分秒的日期对比,需要转化为对应的字符去比较。
select sign_date as date ,
date1,
(case when sign_date > date1 then 1 else 0 end ) date大于于date1,
(case when sign_date < date1 then 1 else 0 end ) date小于date1
from (
select c.sign_date,
to_date('20140101','yyyyMMdd') date1
from table c
)
date | date1 | date大于date1 | date小于date1 | |
1 | 2020/12/16 18:28 | 2014/1/1 | 1 | 1 |
2 | 2020/12/17 11:55 | 2014/1/1 | 1 | 1 |
3 | 2020/12/17 13:21 | 2014/1/1 | 1 | 1 |
4 | 2020/12/20 13:36 | 2014/1/1 | 1 | 1 |
5 | 2020/12/20 17:18 | 2014/1/1 | 1 | 1 |