繁体   English   中英

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

[英]how to compare date parts in SQL Oracle

我有一个棘手的问题。 例如,对于给定的记录,我有一个开始日期:2015年1月15日,结束日期:2015年3月17日,我想笼统地说,知道那些具有确切开始日期和结束日期的记录是否属于一月(根据我的定义,即使它是2015年1月31日,也属于一月份)。

我做了以下事情:

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

但是Round函数的问题在于,它将16-31的所有内容都保留到下个月,这对我不利。 如何修复或重写它以使其符合我的定义?

我想知道具有某些dtime_method_start和dtime_method_end的记录是否属于一月。 我有许多记录,记录的开始和结束日期不同,我想知道其中有多少属于一月。

 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;

此查询比较截断的开始日期和结束日期以匹配每月的第一天。

要检查另一个month_flag,只需在第一个case表达式中更改日期即可。

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

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

只需使用trunc而不是round 参数'MONTH' Trunc会将日期截断为月份的第一天。 如果您between每月的第一天between进行测试,就可以了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM