首页 > 解决方案 > 检查 sysdate 是否等于 Oracle 中的事务日期

问题描述

我有一个名为 courseInfo 的表,其结构如下

Name   ClassName Date_Tx              Remarks   
JON    WONDERS   2018-04-04 10:00:00   NULL

我需要检查每当交易日期(Date_Tx)等于 sysdate 并且备注栏为空时,我需要返回 1 或 0。

我试过的

检查表中备注是否为空

select decode(remarks, null, 'FALSE', 'TRUE') BOOL_VAL from courseInfo;

select * from courseInfo where date_tx = sysdate;

我不确定如何合并两个查询以获得所需的输出。任何帮助是极大的赞赏。

谢谢

标签: databaseoracleoracle11goracle12c

解决方案


由于您只希望日期部分匹配,而不是时间,因此您需要以某种方式忽略时间。

许多没有经验的程序员使用的“懒惰”方式是将条件写为trunc(date_tx) = trunc(sysdate). (一位这样的程序员刚刚在您问题下的评论中做到了这一点。)抵制诱惑!

写这个条件的正确方法是

date_tx >= trunc(sysdate) and date_tx < trunc(sysdate) + 1

这样,您可以避免trunc()在每一行上调用函数。更好的是,如果你有一个索引date_tx(如果你的许多查询使用date_txin 过滤器,你应该有一个索引),我上面写的版本将允许使用索引。如果你 wrap date_txwithin trunc(),则不能使用索引。

或者,如果您经常仅基于日期部分编写查询(并且您不使用时间),您可以创建一个基于函数的索引trunc(date_tx)- 然后,实际上,将条件写为

trunc(date_tx) = trunc(sysdate)

但那是唯一一次你应该这样写!


推荐阅读