我有点棘手的问题。例如。我有一个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月。
答案 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'
使用月份的第一天进行测试,则可以。