我有一张表来记录一个人工作的部门以及开始和结束的日期。
如果我定义一段时间,我怎样才能让每个人获得他/她工作的天数?
例如。
当期间介于2014年5月1日至2014年7月31日期间(日期格式为dd / mm / yyyy)
(id_department, id_person, date_start, date_end)
Person #856
190 856 04/07/2014 null
12 856 17/05/2004 13/06/2008
6 856 13/06/2008 19/09/2013
169 856 19/09/2013 03/07/2014
应该返回工作天数:90天(2014年5月1日至2014年7月7日63日加2014年7月4日至2014年7月31日期间27日)
Person #900
19 900 30/07/2014 null
days: 1
Person #800
21 800 19/02/2013 05/06/2014
days: 35
Person #100
21 100 24/03/2012 05/05/2014
days: 4
以及任何可能的日期组合。是否有可能在一个查询中得到总和?
答案 0 :(得分:1)
这样的事情应该有效:
select person_id,
SUM(case
when
date_start >= to_date('01/05/2014','dd/mm/yyyy')
and date_end <= to_date('31/07/2014', 'dd/mm/yyyy')
then (date_end - date_start)
when
to_date('01/05/2014','dd/mm/yyyy') > date_start
and to_date('31/07/2014', 'dd/mm/yyyy') < date_end
then (to_date('31/07/2014','dd/mm/yyyy') - to_date('01/05/2014','dd/mm/yyyy'))
when
to_date('01/05/2014','dd/mm/yyyy') < date_start
and to_date('31/07/2014', 'dd/mm/yyyy') < date_end
then (to_date('31/07/2014','dd/mm/yyyy') - date_start)
when
to_date('01/05/2014','dd/mm/yyyy') > date_start
and to_date('31/07/2014', 'dd/mm/yyyy') > date_end
then (date_end - to_date('01/05/2014','dd/mm/yyyy'))
else 0
end)
as days
from table_name
group by person_id
答案 1 :(得分:1)
这是一个非常简单的方法:
with dates as (
select date '2014-05-01' as PeriodStart, date '2014-07-31' as PeriodEnd
from dual
)
select p.*,
(case when p.date_end >= dates.PeriodStart and p.date_start <= dates.PeriodEnd
then least(dates.PeriodEnd, p.date_end) - greatest(dates.PeriodStart, p.date_start)
end) as DaysInPeriod
from dates cross join
persons p;
请注意,这使用Oracle的标准作为日期常量(date
关键字后跟ISO标准YYYY-MM-DD格式)。您可以以任何您喜欢的格式输出日期,但是当您在数据库中使用它们时,您应该使用本机格式。