Oracle中SQL日期比较无结果异常:日期存储精度疑问
问题分析与解决方案
这个问题本质是Oracle DATE类型的精度限制导致的,咱们一步步拆解清楚:
1. Oracle DATE类型的存储逻辑
Oracle的DATE类型仅支持到秒级精度,它的存储结构里根本没有毫秒的位置。所以当你执行插入语句时:
insert into A(xxx,xxx,cdate) values(xxx,xxx,sysdate)
哪怕sysdate返回的是带毫秒的时间(比如2019/5/30 12:02:58.100),Oracle也会自动截断毫秒部分,只保留到秒,所以最终cdate字段存储的值就是2019/5/30 12:02:58——不是后台存了不显示,是真的没存毫秒。
2. 日期比较时的实际取值
当过程2执行查询语句:
select xxx from A where cdate < sysdate
这里的关键是类型对齐规则:因为cdate是DATE类型,Oracle会把右边的sysdate(当前系统时间2019/5/30 12:02:58.200)也截断到秒级,变成2019/5/30 12:02:58。这时候两边的时间完全相等,cdate < sysdate的结果为false,自然查不到任何数据——和你推测的完全一致。
3. 解决办法:改用TIMESTAMP类型保留毫秒精度
如果你的业务需要毫秒级的时间精度和准确比较,建议:
- 将
A表的cdate字段类型修改为TIMESTAMP - 插入时使用
systimestamp(返回带毫秒的时间戳),比如:insert into A(xxx,xxx,cdate) values(xxx,xxx,systimestamp); - 查询时也用
systimestamp或者直接比较TIMESTAMP类型的值,这样就能完整保留毫秒信息,比较时也会使用完整的时间戳,不会出现截断导致的不符合预期的结果。
内容的提问来源于stack exchange,提问作者Robin Sun
相关产品推荐
相关产品推荐

