Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据SQL中的开始日期和结束日期在年-月级别上聚合度量值?_Sql_Oracle_Datetime_Count_Recursive Query - Fatal编程技术网

如何根据SQL中的开始日期和结束日期在年-月级别上聚合度量值?

如何根据SQL中的开始日期和结束日期在年-月级别上聚合度量值?,sql,oracle,datetime,count,recursive-query,Sql,Oracle,Datetime,Count,Recursive Query,我有一个SQL查询,它包含三列,如下所示 employee_id start_date end_date hours 123 09-01-2019 09-02-2019 8 123 09-28-2019 10-01-2019 32 我想重写查询,而不是细化查询,我只想知道员工在年-月级别上的SUMHR,如下所示: employee_id Year_Month hours 123 201909

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

employee_id  start_date  end_date       hours
123          09-01-2019  09-02-2019     8
123          09-28-2019  10-01-2019     32
我想重写查询,而不是细化查询,我只想知道员工在年-月级别上的SUMHR,如下所示:

employee_id  Year_Month       hours
123          201909            32
123          201910            8

员工9月份有4天,因此4*8=32,10月份有一天,因此10月份有8小时。我的问题是相邻月份之间何时有开始和结束日期交叉。我不知道如何编写查询以获得所需的输出,我非常感谢您在这方面提供的任何帮助。使用递归查询来生成每月的天数序列,然后按月汇总并计数可能更简单:

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小时。

请您提供原始数据的样本。在示例中,我给出了8小时,但可能会有所不同。因此,理想情况下,它是两个日期之间的天数乘以小时数列。在这种情况下,如果我用*小时数代替*8数,这行得通吗?@PrashanthChitrambalam:也许,你是说*小时数。但在这种情况下,您也需要cte返回列小时数。