【问题标题】:Why does my SQL query of date fields sometimes need trunc() (Oracle)?为什么我的日期字段 SQL 查询有时需要 trunc() (Oracle)?
【发布时间】:2010-10-07 22:08:24
【问题描述】:

我有两个表,我在其中查询每个表中的日期列。

在一种情况下需要在日期字段上使用 trunc() 函数来取回值,在另一种情况下我不需要。

这适用于表 1:

SELECT to_char( datecol1 ,'mm/dd/yyyy hh:mm:ss') 
FROM table1 where datecol1    =to_date('10/07/2010', 'mm/dd/yyyy');

但在表 2 上,上面的语法不起作用,我需要 trunc(),例如:

SELECT to_char( datecol2 ,'mm/dd/yyyy hh:mm:ss') 
FROM table2 where trunc(datecol2) =to_date('10/07/2010', 'mm/dd/yyyy');

注意三点:

  1. 在使用 to_char(datecol1 ,'mm/dd/yyyy hh:mm:ss') 查询 table1 时,它看起来好像所有时间都在 12:00 到 12:10 之间,但是全天都插入了值李>
  2. 向 table1 插入记录时,我只插入 mm/dd/yyyy,没时间
  3. 向table2插入记录时我插入了时间

有人可以解释一下吗:

  • 为什么在table1 上不需要截断,而在table2 上需要截断?
  • 为什么 table1 中的所有值都在 12:00 到 12:10 之间?

【问题讨论】:

    标签: sql oracle datetime


    【解决方案1】:

    在表 1 中,您的数据没有“时间”部分,因此日期应该匹配 - 这是您观察到的。但是,您使用mm 来格式化时间的分钟部分 - 但mm,而不是分钟 (mi)。这就是为什么您会看到 12:00 以外的时间,以及为什么它们的范围仅在 12:10 左右(您可能只有今年的数据?)

    在表 2 中,由于您对数据有“时间”组件,因此您需要将其截断以匹配仅日期值,这是 to_date() 函数返回的值,给定您使用的格式。

    【讨论】:

    • 关于 mm 与 mi 的好消息
    • 在日期时间掩码中使用 MM 而不是 MI 是我们都经历过的经典前额拍打时刻之一。
    【解决方案2】:

    *在table1中插入记录时,我只是插入mm/dd/yyyy,没时间

    在向table2插入记录时,我插入了时间*

    这就是为什么您在第二个查询中需要 trunc 的原因。 to_date('10/07/2010', 'mm/dd/yyyy') 正在生成一个带有午夜时间分量的“日期”,就像在没有时间分量的情况下插入到 Table1 中一样。在第二种情况下,有一个时间组件,trunc 将其去掉,因此您可以将日期部分与to_date('10/07/2010', 'mm/dd/yyyy') 的日期部分进行比较

    如果dateCol1 上有索引,您可能需要将第二个查询重写为:

    SELECT to_char( datecol2 ,'mm/dd/yyyy hh:mi:ss')  
    FROM table2 
    WHERE to_date('10/07/2010', 'mm/dd/yyyy') <= dateCol2
    and dateCol2 < to_date('10/08/2010', 'mm/dd/yyyy')
    

    SELECT to_char( datecol2 ,'mm/dd/yyyy hh:mi:ss')  
    FROM table2 
    WHERE dateCol2 between to_date('10/07/2010', 'mm/dd/yyyy') 
        and to_date('10/07/2010 11:59:59 PM', 'MM/DD/YYYY HH12:Mi:SS AM')
    

    或者在 trunc(dateCol2) 上创建基于函数的索引,而不是在 dateCol2 上创建普通索引,具体取决于其他查询。

    因为参与函数的列通常不能使用索引,并且会强制进行表扫描,从而从优化器中夺走选项。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多