select count(*) from CI_TXN_HEADER where TXN_HEADER_DTTM = '25-JAN-13';
结果: 1
select count(*) from CI_TXN_HEADER where TXN_HEADER_DTTM like '25-JAN-13';
结果: 19
在我的数据库中,我有19行TXN_HEADER_DTTM
为 25-JAN-13 。
TXN_HEADER_DTTM
的数据类型为DATE
。
有人可以解释输出的差异吗?
答案 0 :(得分:4)
Oracle DATE
列包含日期和。 LIKE
条件仅适用于VARCHAR
列。如果应用于其他数据类型,Oracle会将其隐式转换为varchar(使用规则,具体取决于当前客户端设置)。
所以你可能有一些行,例如2013-01-25 17:42:01
,但字符串常量'25-JAN-13'
(很可能)转换为:2013-01-25 00:00:00
,因此=
比较不起作用。
要查找特定日期的所有行,请使用trunc()
和正确的 date literal。不要依赖邪恶的隐式数据类型转换来指定日期值。
使用trunc()
将DATE
值的时间部分设置为00:00:00
:
我更喜欢ANSI SQL日期文字:
select count(*)
from CI_TXN_HEADER
where trunc(TXN_HEADER_DTTM) = DATE '2013-01-25';
您也可以使用Oracle的to_date:
select count(*)
from CI_TXN_HEADER
where trunc(TXN_HEADER_DTTM) = to_date('2013-01-25', 'yyyy-mm-dd');
请注意,Oracle无法在TXN_HEADER_DTT
上使用索引,因此如果性能至关重要,请使用范围查询:
select count(*)
from CI_TXN_HEADER
where TXN_HEADER_DTTM >= DATE '2013-01-25'
and TXN_HEADER_DTTM < DATE '2013-01-25' + 1;
答案 1 :(得分:2)
在此链接中解释了相似和相等之间的差异非常好 https://stackoverflow.com/a/2336940/4506285
我在桌子上检查了你的问题,得到了相同的结果。
此链接还有助于了解如何比较sql中的日期 https://stackoverflow.com/a/18505739/4506285
答案 2 :(得分:1)
也许你的数据是由空间组成的,它并不完全是&#39; 25-JAN-13&#39;但是&#39; 25-JAN-13&#39 ;;
请参考以下两个链接: