SQL:添加缺少的日期和值

问题描述

你好,第一次海报! :)

我有一个输出此示例数据的表,但是对于许多用户和不同的日期范围:-

Users..........Date..............Hours
John Smith.....Thu 02-JAN-2020...8 
John Smith.....Fri 03-JAN-2020...8 
John Smith.....Mon 06-JAN-2020...8 
John Smith.....Tue 07-JAN-2020...8 
John Doe.......Fri 03-JAN-2020...8
John Doe.......Mon 06-JAN-2020...8 
John Doe.......Tue 07-JAN-2020...8 
John Doe.......Wed 08-JAN-2020...8

结果应为:-
用户........日期........................小时
John Smith ..... Thu 02-JAN-2020 ... 8
John Smith ..... Fri 03-JAN-2020 ... 8
John Smith ..... Sat 04-JAN-2020 ... 0 MISSING WEEKEND
John Smith ..... Sun 05-JAN-2020 ... 0 MISSING WEEKEND
John Smith ..... Mon 06-JAN-2020 ... 8
John Smith ..... Tue 07-JAN-2020 ... 8
John Doe .......星期五03-JAN-2020 ... 8
John Doe ....... 2020年1月4日星期六... 0周末失踪
John Doe ....... Sun 05-JAN-2020 ... 0 MISSING WEEKEND
John Doe ....... 2020年1月6日星期一... 8
John Doe ....... Tue 07-JAN-2020 ... 8
John Doe ....... 2020年1月8日星期三... 8

我需要查询包括缺少的周末,名称和小时数为零(因为DBA不会更改表的结构并添加周末)。

已经看过CTE的(递归),CROSS JOINS,链接日历表,但是无法使其正常工作。

收到任何建议或指示。

非常感谢。

P.S。仍然习惯格式化,道歉。

解决方法

如果我的理解正确,您可以使用union all查找用户有另一个约会的星期五。然后再添加两行。

我将假设date列实际上具有date数据类型。

这里是个主意:

select user,date,hours
from t
union all
select user,dateadd(day,v.n,date),0
from (select t.*,lead(date) over (partition by user order by date) as next_date
      from t
     ) t cross join
     (values (1),(2)) v(n)
where datepart(weekday,t.date) = 'Friday' and
      next_date is not null;

众所周知,日期/时间功能与数据库有关。这使用SQL Server语法。