我想要什么:
我想为一段时间内的每一天和每一位员工制定工作模式。也就是说,我有一个表,其中包含一家公司所有员工的工作模型。工作模型被分配给员工一段时间。因此,一名员工一年中可能有不止一种工作模式。因此,我想做的是检索任何日期范围内的每一天和任何员工的工作模型。这在SQL中可能吗?如果是,我应该如何处理?
我正在使用SQl Developper 3.0.04版本。数据库来自Oracle。
为了更好地了解我的问题,请访问下面的链接,查看包含数据的表以及显示查询结果的表的模式。
用于模式的SQLFiddle链接
表employee显示了包含分配给员工的工作模型以及´有效期的表。第一行表示员工1从2000年1月1日至2009年6月21日被分配了52101工作模型。
表结果显示了我查询日期范围的结果应该是什么样子。日期范围为2013年2月19日至2013年2日23日。
我使用以下SQL查询生成日期范围内的天数:
SELECT to_char(trunc(to_date('19.02.2013'))-1+rownum,'dd/mm/yyyy') days
FROM all_objects
WHERE ROWNUM <= (to_date('23.02.2013') - to_date('19.02.2013'))+1
尽管如此,我无法为每一天和每一位员工分配正确的工作模式。
提前感谢您的回答。
为了生成日期列表,最好使用以下方式:
SELECT TO_DATE('18.02.2013', 'dd.mm.yyyy') + LEVEL
FROM dual
CONNECT BY TO_DATE('18.02.2013', 'dd.mm.yyyy')+LEVEL <= TO_DATE('23.02.2013', 'dd.mm.yyyy');
在Wernfried和以下帖子的帮助下:链接到一个几乎类似的问题,我找到了我的问题的解决方案。这是一个查询,这在一天结束时很容易,但对我来说是一个挑战
With calendar_cte As (
SELECT TO_DATE('19.02.2013', 'dd.mm.yyyy')+ LEVEL-1 days
FROM dual
CONNECT BY Level <= (TO_DATE('23.02.2013', 'dd.mm.yyyy') - TO_DATE('19.02.2013', 'dd.mm.yyyy'))+1)
Select c.days,e.employee,e.work_model,e.country,e.calendar
from employee e inner join calendar_cte c on c.days between e.valid_from and e.valid_to;