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

时间:2013-11-27 11:33:29

标签: sql oracle

我想要的是什么:

我想拥有一段时间内每一天和每一位员工的工作模式。也就是说,我有一个包含公司所有员工工作模型的表格。工作模型在一定时期内分配给员工。因此,员工一年可能有多个工作模式。所以我想要做的是检索任何日期范围内的每一天的工作模型以及任何单个员工。在SQL中有可能吗?如果是,我该怎么办?

我正在使用SQl Developper版本3.0.04。该数据库来自Oracle。

为了更好地理解我的问题,请按照以下链接查看包含数据的表格的架构,以及显示查询结果应该如何的表格。

Link to SQLFiddle for the Schemas

表员工显示的表格包含分配给员工的工作模型以及有效期间。第一行表示员工1已从01.01.2000到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

尽管我无法为每一天和每位员工分配正确的工作模式。

提前感谢您的回答。

2 个答案:

答案 0 :(得分:0)

为了生成日期列表,最好使用这种方式:

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');

答案 1 :(得分:0)

在Wernfried和以下帖子Link to a almost similar problem的帮助下,我找到了解决问题的方法。这是查询,这在一天结束时非常容易,但对我来说这是一个挑战。

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;