sql如何向表中添加缺少的一周

时间:2016-02-10 08:04:58

标签: sql sql-server

我有一个table,其中包含以下数据:员工报告的日期when和该周的start-date(Monday)周。现在他们没有全部工作dates。例如,christmas周没有数据。有没有办法可以添加丢失的week。因此,对于每个start-date,我仍然会有week周。但report-date可以为空。

我无法声明variables

这就是我所拥有的

enter image description here

这就是我想要添加缺失的一周

enter image description here

3 个答案:

答案 0 :(得分:1)

查询 的 SQLFIDDLEEXAMPLE

CREATE TABLE tb 
    (
     d1 date, 
     d2 date
    );

INSERT INTO tb
(d1, d2)
VALUES
('2015-12-10', '2015-12-07'),
('2015-12-15', '2015-12-14'),
('2015-12-29', '2015-12-28'),
('2016-01-05', '2016-01-04');

SET DATEFIRST 1 

INSERT INTO tb
( d1, d2 )
select null, DATEADD(day,number,'2015-01-01')
FROM master..spt_values t1
LEFT JOIN tb t2
ON DATEADD(day,number,'2015-01-01') = t2.d2
WHERE type = 'P'
AND DATEADD(day,number,'2015-01-01') >= '2015-12-01'
AND DATEADD(day,number,'2015-01-01') <= '2016-01-04'
AND DATEPART(weekday,DATEADD(day,number,'2015-01-01')) = 1
AND t2.d2 is null

SELECT *
FROM tb

结果:

|         d1 |         d2 |
|------------|------------|
| 2015-12-10 | 2015-12-07 |
| 2015-12-15 | 2015-12-14 |
| 2015-12-29 | 2015-12-28 |
| 2016-01-05 | 2016-01-04 |
|     (null) | 2015-12-21 |

答案 1 :(得分:0)

您可以创建一个新的日历/周表,其中包含一年中的所有周。该表应该提前。

然后,您可以从数据表中引用此日历表(按ID或周/年)。

您的报告应基于日历表,并在数据表中添加外部联接。

这样,即使几周内没有任何数据,您的报告也会包含所有周数。

编辑:你需要一个像这样的新表:

Week:
| Start date | End date |
| 12/07/15   | 12/13/15 |
| 12/14/15   | 12/20/15 |
| 12/21/15   | 12/27/15 |
etc...

答案 2 :(得分:0)

假设#weekly_calendar表包含您的有效工作周(即2015年12月)。顺便说一下,语法适用于MSSQL。您应该指定您正在使用的数据库。

您还可以在运行时动态创建日历。这只是为了以易于理解的方式展示概念。

-- week start dates
-- 2015-12-01
-- 2015-12-07
-- 2015-12-14
-- 2015-12-21
-- 2015-12-28

create table #weekly_calendar (
    week_start_date datetime,
    week_end_date datetime
)

假设#report_date包含员工的报告日期。

-- report dates
-- 2015-12-02
-- 2015-12-15
-- 2015-12-29

create table #report_date (
    report_date datetime
)

这是显示未报告日期的方式。

select * from #weekly_calendar w
left join #report_date r
on r.report_date between w.week_start_date and w.week_end_date

如果您没有week_end_date。再假设您的工作日从星期一到星期五开始。

select * from #weekly_calendar w
left join #report_date r
on r.report_date between w.week_start_date and DATEADD(dd, 6-(DATEPART(dw, w.week_end_date)), w.week_end_date)

enter image description here