oracle的to_date判断不正确问题

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 
)
datedate1date大于date1date小于date1
12020/12/16 18:282014/1/111
22020/12/17 11:552014/1/111
32020/12/17 13:212014/1/111
42020/12/20 13:362014/1/111
52020/12/20 17:182014/1/111


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值