【问题标题】:Comparing Date with datetime format比较日期和日期时间格式
【发布时间】:2015-04-07 09:56:00
【问题描述】:

如何缩短以下语句:

select * from orders
where to_char(trunc(Cancel_Date,'MONTH'),'dd/mm/yyyy')='01/03/2015'
  and state = 'Cancelled'
  and to_date(to_char(trunc(Order_Date,'MONTH'),'dd/mm/yyyy'),'dd/mm/yyyy') < to_date('01/03/2015','dd/mm/yyyy')

【问题讨论】:

    标签: sql oracle date compare


    【解决方案1】:

    您似乎正在尝试检索在 3 月之前订购但在 3 月取消的订单?如果是这样,我会避免使用这样的过滤器:to_char(trunc(Cancel_Date,'MONTH'),'dd/mm/yyyy')='01/03/2015';如果您在cancel_date 上有索引,则不会使用它(除非您在该列上有基于函数的索引!)。我会做以下事情:

    SELECT * FROM orders
     WHERE status = 'Cancelled'
       AND cancel_date >= DATE'2015-03-01'
       AND cancel_date < DATE'2015-04-01'
       AND order_date < DATE'2015-03-01';
    

    在上面的查询中,我使用的是 ANSI 日期文字(我相信自 9i 以来在 Oracle 中支持)而不是使用 TO_CHAR()TO_DATE() 等。而且我没有对 cancel_date 或 @987654327 应用任何函数@ 以便优化器可以使用这些列上的索引(如果它们存在)。

    附带说明,使用SELECT * 而不是明确命名您需要的列通常不被视为最佳做法。

    【讨论】:

      【解决方案2】:

      在 where 条件的第二部分不需要截断:

      select * 
      from orders
      where to_char(trunc(Cancel_Date,'MONTH'),'dd/mm/yyyy')='01/03/2015'
        and state = 'Cancelled'
        and Order_Date < to_date('01/03/2015','dd/mm/yyyy')
      

      【讨论】:

        【解决方案3】:

        函数 trunc 返回一个日期。您无需将其转换为 char 并再次返回 date。

        where trunc(Cancel_Date,'MONTH') = to_date('01/03/2015','dd/mm/yyyy')
        and state = 'Cancelled'
        and trunc(Order_Date,'MONTH') < to_date('01/03/2015','dd/mm/yyyy')
        

        【讨论】:

          猜你喜欢
          • 2015-07-20
          • 1970-01-01
          • 2012-02-07
          • 1970-01-01
          • 1970-01-01
          • 2014-04-01
          • 1970-01-01
          • 2018-03-21
          • 1970-01-01
          相关资源
          最近更新 更多