首页 > 解决方案 > 如何根据 SQL 中的开始和结束日期聚合年月级别的度量?

问题描述

我有一个 SQL 查询,它包含如下三列

employee_id  start_date  end_date       hours
123          09-01-2019  09-02-2019     8
123          09-28-2019  10-01-2019     32

我想重写查询,而不是细化,我只想知道员工在年月级别上的总和(小时),如下所示:

employee_id  Year_Month       hours
123          201909            32
123          201910            8

员工在 9 月有 4 天,因此 4*8=32,在 10 月有 1 天,因此 10 月有 8 小时。我的问题是相邻月份之间有交叉的开始日期和结束日期。我不确定如何编写查询来获得我想要的输出,我非常感谢任何帮助

标签: sqloracledatetimecountrecursive-query

解决方案


使用递归查询在每个月生成一系列天,然后按月聚合并计数可能会更简单:

with
    data as (< your existing query here >), 
    cte (employee_id, dt, max_dt) as (
        select employee_id, start_date, end_date from data
        union all
        select employee_id, dt + 1, max_dt from cte where dt + 1 < max_dt
    )

select employee_id, to_char(dt, 'yyyymm')  year_months, count(*) * 8 hours
from mytable
group by employee_id, to_char(dt, 'yyyymm')

如您的问题所述,这假设每天 8 小时。


推荐阅读