【问题标题】:Output of the query in oracle [duplicate]oracle中查询的输出[重复]
【发布时间】:2017-11-03 07:05:09
【问题描述】:

查询一:

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_DTTM25-JAN-13TXN_HEADER_DTTM 的数据类型为 DATE

有人可以解释一下输出的不同吗?

【问题讨论】:

  • 数据库中有多少行应该匹配?
  • @AbsoluteƵERØ 数据库中有 19 行具有给定日期,因此两种情况下的输出应该相同吧?我想它应该匹配 19 行。
  • 你能运行这个查询并发布输出吗? - select count(*), TXN_HEADER_DTTM FROM CI_TXN_HEADER GROUP BY TXN_HEADER_DTTM;

标签: sql oracle


【解决方案1】:

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;

【讨论】:

    【解决方案2】:

    like 和 equal 的区别在这个链接里解释得很好 https://stackoverflow.com/a/2336940/4506285

    我在我的桌子上检查了你的问题,我得到了相同的结果。

    此链接还有助于了解如何在 sql 中比较日期 https://stackoverflow.com/a/18505739/4506285

    【讨论】:

      【解决方案3】:

      也许您的数据由空间组成,它不完全是“25-JAN-13”而是“25-JAN-13”;

      请参考这两个链接:

      1. Equals(=) vs. LIKE

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

      【讨论】:

        猜你喜欢
        • 2021-10-14
        • 1970-01-01
        • 2013-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-11
        • 2013-07-27
        • 2018-06-10
        相关资源
        最近更新 更多