如何在SQL中检索一段时间内的每一天的数据



我想要什么:

我想为一段时间内的每一天和每一位员工制定工作模式。也就是说,我有一个表,其中包含一家公司所有员工的工作模型。工作模型被分配给员工一段时间。因此,一名员工一年中可能有不止一种工作模式。因此,我想做的是检索任何日期范围内的每一天和任何员工的工作模型。这在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;  

相关内容

最新更新