如何比较SQL Oracle中的日期部分

时间:2015-10-02 08:57:57

标签: sql oracle date

我有点棘手的问题。例如。我有一个start_date:2015年1月15日和结束日期:2015年3月17日给定记录,我想概括一下,如果具有那些确切的开始和结束日期的记录属于1月(根据我的定义)即使是2015年1月31日,它也属于1月)。

我做了以下事情:

sum(case when to_date('2015/01/01','yyyy/mm/dd') between ROUND(dtime_method_start,'MONTH') and ROUND(dtime_method_end,'MONTH') then 1 else 0 end) as flag_jan

但是圆形功能的问题在于它需要从下个月的16-31开始,这对我没有好处。如何修复或重写它以使其符合我的定义?

我想知道某个dtime_method_start和dtime_method_end的记录是否属于January。我有许多记录,有许多不同的开始和结束日期,并想知道它们中有多少属于1月。

3 个答案:

答案 0 :(得分:1)

 SELECT expected,
       CASE
           WHEN to_date('01/01/2015','DD/MM/YYYY') = ALL (trunc(start_date,'MONTH'), trunc(end_date,'MONTH'))
           THEN 1
           ELSE 0
       END flag_jan
FROM
  (SELECT 'notmatch 0'                        expected
         , to_date('15/01/2015','DD/MM/YYYY') start_date
         , to_date('17/03/2015','DD/MM/YYYY') end_date
   FROM dual
  UNION ALL 
   SELECT 'match 1'
        , to_date('12/01/2015','DD/MM/YYYY')
        , to_date('23/01/2015','DD/MM/YYYY')
   FROM dual
  ) dates;

此查询会比较截断的start_date和end_date以匹配该月的第一天。

要检查另一个month_flag,juste会更改第一个case表达式中的日期。

答案 1 :(得分:0)

我会根据输入日期将存储的日期直接与范围进行比较,而不是将函数应用于每个日期:

count(case when dtime_method_start >=            trunc(to_date('2015/01/01','yyyy/mm/dd'),'mm') 
            and dtime_method_start <  add_months(trunc(to_date('2015/01/01','yyyy/mm/dd'),'mm'),1)
           then 1
       end) as flag_jan

或者你可以

count(case when trunc(dtime_method_start,'mm') = trunc(to_date('2015/01/01','yyyy/mm/dd'),'mm') 
           then 1
       end) as flag_jan

答案 2 :(得分:0)

只需使用trunc代替round。带参数Trunc的{​​{1}}会将日期截断为月的第一天。如果您使用'MONTH'使用月份的第一天进行测试,则可以。