代码之家  ›  专栏  ›  技术社区  ›  Baalback

函数trunc()与datetime列中函数trunc()之间的差异

  •  1
  • Baalback  · 技术社区  · 7 年前

    这是查询吗

    select 1 from tab1 where
    TRUNC(tab1.T_DATE) = TRUNC(to_date('2018-08-31','yyyy-mm-dd'))
    

    与此类似?

    select 1 from tab1 where    
            tab1.T_DATE >= to_date('2018-08-31','yyyy-mm-dd')
            And tab1.T_DATE < to_date('2018-09-01','yyyy-mm-dd')
    

    当我需要使用函数Trunc()时?我之所以问这个区别,是因为我有一个使用Trunc()的查询,查询需要索引(当然我不想使用FBI),所以我用 AND . 但是我担心会有一些不同。

    数据示例:

    31/08/2018
    31/08/2018
    31/08/2018
    31/08/2018
    31/08/2018
    31/08/2018
    31/08/2018
    31/08/2018
    31/08/2018
    31/08/2018
    31/08/2018
    31/08/2018 10:19:02 PM
    31/08/2018 07:55:01 PM
    31/08/2018 1:08:54 PM
    31/08/2018 1:18:44 PM
    31/08/2018 1:45:34 PM
    31/08/2018 1:53:57 PM
    31/08/2018 1:59:01 PM
    31/08/2018 2:04:19 PM
    31/08/2018 4:06:56 PM
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Gordon Linoff    7 年前

    你在问这些是否相等:

    where TRUNC(tab1.T_DATE) = TRUNC(to_date('2018-08-31','yyyy-mm-dd'))
    
    where tab1.T_DATE >= to_date('2018-08-31','yyyy-mm-dd') and
          tab1.T_DATE < to_date('2018-09-01','yyyy-mm-dd')
    

    对。他们都带回了所有的价值观 T_DATE 2018-08-31,无论日期。 TRUNC() 应用于日期时,将删除时间组件。因此,在第一个表达式的右侧不需要它。

    我会这样写:

    where tab1.T_DATE >= date '2018-08-31' and
          tab1.T_DATE < date '2018-09-01'
    

    因为它可以在上使用索引 tab1(T_DATE)

        2
  •  0
  •   Thorsten Kettner    7 年前

    是的,这两个查询做完全相同的事情。

    甲骨文缺乏真正的 DATE 日期 DATETIME ,这让人们一次又一次地感到困惑:-)通过使用check约束来拒绝带有时间部分的日期,或者使用删除该部分的触发器,可以得到一个真正的数据列。

    第一个查询更具可读性。人们经常反对这种观点,认为第二个查询可以从 T_DATE 列。但是,由于Oracle具有函数索引功能,因此您可以在 TRUNC(t_date) 这个论点是无效的。