database - 检查 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;
我不确定如何合并两个查询以获得所需的输出。任何帮助是极大的赞赏。
谢谢
解决方案
由于您只希望日期部分匹配,而不是时间,因此您需要以某种方式忽略时间。
许多没有经验的程序员使用的“懒惰”方式是将条件写为trunc(date_tx) = trunc(sysdate)
. (一位这样的程序员刚刚在您问题下的评论中做到了这一点。)抵制诱惑!
写这个条件的正确方法是
date_tx >= trunc(sysdate) and date_tx < trunc(sysdate) + 1
这样,您可以避免trunc()
在每一行上调用函数。更好的是,如果你有一个索引date_tx
(如果你的许多查询使用date_tx
in 过滤器,你应该有一个索引),我上面写的版本将允许使用索引。如果你 wrap date_tx
within trunc()
,则不能使用索引。
或者,如果您经常仅基于日期部分编写查询(并且您不使用时间),您可以创建一个基于函数的索引trunc(date_tx)
- 然后,实际上,将条件写为
trunc(date_tx) = trunc(sysdate)
但那是唯一一次你应该这样写!