我如何得到下面的结果,查询将通过给出开始和结束日期来运行,例如用户可以从1/1/2023 - 6/20/2023运行此查询
表数据:
employee date_from date_to
x 1/1/2023 2/9/2023
y 10/1/2023 3/30/2023
字符集
预期结果:
employee date_from date_to year quarter comments
X 1/1/2023 2/9/2023 2023 q1 Employee X was active 40 out of the 90 days.
y 10/1/2023 3/30/2023 2022 q4 Employee y was active 90 out of the 90 days.
y 10/1/2023 3/30/2023 2023 q1 Employee y was active 90 out of the 90 days.
型
我需要这个与PL/SQL这是可能的吗?
谢谢你,谢谢
3条答案
按热度按时间ni65a41a1#
不需要生成开始日期和结束日期之间的所有天数;相反,您可以更高效地使用递归查询生成连续季度:
字符集
其中,对于样本数据:
型
输出:
| 日期_从|日期至|年份|季度|天数|评论| COMMENTS |
| --|--|--|--|--|--| ------------ |
| 2019 -01- 21 00:00:00| 2019 -02- 29 00:00:00|二〇二三|Q1|四十|员工X在90天中被雇用了40天。||
| 2019 -01 - 12 00:00:00| 2019 -03- 23 00:00:00|二〇二二|Q4|九十二个|雇员y在92天中被雇用了92天。||
| 2019 -01 - 12 00:00:00| 2019 -03- 23 00:00:00|二〇二三|Q1|六十二|雇员y在90天中被雇用了62天。||
fiddle
1aaf6o9v2#
可以使用以下查询获取两个给定日期之间的所有日期
字符集
你也可以过滤出星期日添加(我认为编号是国家特定)
型
您可以使用
TO_CHAR(dr.query_date , 'Q')
获取给定日期的季度因此,最终的查询应该看起来像这样:
型
结果:对于范围:
型
xmd2e60i3#
是的,没有PLSQL也可以。您需要一个日期表(可以“即时”生成),但存储“日历”并不罕见。例如,您可以从存储或生成的日历中排除周末。然后,您的查询使用该日历作为“from表”,员工是通过落在员工范围的from/to日期内的日期连接的数据,然后通过group by计算每个季度的日历日期。
字符集
| QTR|天数| DAYS |
| --|--| ------------ |
| 2023年第一季度|二十九| 29 |
fiddle
注意要显示整个起始/终止日期之间的所有季度,如果上面显示的是内部连接,则需要使用
LEFT JOIN
,并且还需要相应地更改where子句。