[英]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.