在oracle中输出查询

时间:2017-11-03 07:05:10

标签: sql oracle

查询1:

select count(*) from CI_TXN_HEADER where TXN_HEADER_DTTM = '25-JAN-13';

结果: 1

查询2:

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

有人可以解释输出的差异吗?

3 个答案:

答案 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 ;;

请参考以下两个链接:

  1. Equals(=) vs. LIKE

  2. What's the difference between "LIKE" and "=" in SQL?