Oracle中查询Insert_Date等于当前日期的记录(TRUNC方法无效)
问题描述
我有如下数据表:
| Item | Insert_Date |
|---|---|
| A | 11-JAN-23 |
| B | 10-JAN-23 |
我想查询Insert_Date等于当前日期的记录,不想用手动指定日期值的语句:
select * from My_Table where insert_date = '11-JAN-23' ;
我尝试执行以下语句,但无法生效:
select * from My_Table where insert_date = TRUNC(CURRENT_DATE) ;
请问该如何正确实现需求?
解决方案
语句失效大概率是因为Insert_Date字段包含时间部分(比如11-JAN-23 14:30:00),而TRUNC(CURRENT_DATE)仅返回日期的零时点(比如11-JAN-23 00:00:00),两者无法精准匹配。可以通过以下几种方式解决:
方式一:截断字段的时间部分
将Insert_Date的时间部分截断后,再和当前日期的截断值比较:select * from My_Table where TRUNC(insert_date) = TRUNC(CURRENT_DATE);注意:如果表数据量较大,
TRUNC(insert_date)会导致字段上的索引失效,拖慢查询速度。方式二:使用范围查询(推荐)
用当前日期的起始和结束范围来匹配记录,这种方式可以正常利用Insert_Date上的索引:select * from My_Table where insert_date >= TRUNC(CURRENT_DATE) and insert_date < TRUNC(CURRENT_DATE) + INTERVAL '1' DAY;方式三:检查时区与日期函数适配
如果数据库时区和当前会话时区不一致,CURRENT_DATE返回的日期可能不符合预期。可以尝试用数据库原生的日期函数替代,比如Oracle中用SYSDATE:select * from My_Table where TRUNC(insert_date) = TRUNC(SYSDATE);
内容的提问来源于stack exchange,提问作者Kei Zez
相关产品推荐
相关产品推荐

