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。。。。。2020年1月2日星期四…8
John Smith。。。。。2020年1月3日星期五…8
John Smith。。。。。2020年1月4日星期六…0错过一周
John Smith。。。。。2020年1月5日星期日…0错过一周
John Smith。。。。。2020年1月6日星期一…8
约翰·史密斯。。。。。2020年1月7日星期二…8
无名氏。。。。。。。2020年1月3日星期五…8
无名氏。。。。。。。2020年1月4日星期六…0失踪一周
John Doe。。。。。。。2020年1月5日星期日…0失踪一周
John Doe。。。。。。。2020年1月6日星期一…8
无名氏。。。。。。。2020年1月7日星期二…8
无名氏。。。。。。。2020年1月8日星期三…8

我需要一个查询来包括缺失的周末、零的Name和Hours(因为DBA不会更改表的结构并添加周末(。

已经研究过CTE(递归(,CROSS JOIN,链接日历表,但无法实现。

收到的任何建议或指示。

非常感谢。

第页。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语法。

如何在下面的查询中添加缺少的日期。。

$选择u.NAME、u.BADGENUMBER、attemption。SENSORID,出席。CHECK日期,出席人数。办理入住手续,出席。结账,强制转换(DATEDIFF(n,attendance.CheckIn,attendance.checkout(/60为varchar(+':'+强制转换(DATEDIFF(n,Attendanance.CheckIn、attendance.checkout(+60为分钟来自(选择temp.USERID,temp.SENSORID,temp.CHECKDate,temp。签入,当temp.COut=temp.CheckIn时为case,然后当temp.CheckIn为null时为null,然后为null,否则temp.COut结束为CheckOut来自(选择c.USERID,c.SENSORID,转换(日期,CHECKTIME(CHECKDate--,(选择temp.USERID,dateadd(day,1,CHECKTIME cinout,其中temp.USERID=c.USERID((CHEC2,(从CHECKINOUT cinout中选择min(CHECKTIME(,其中cinout。USERID=c.USERID和cinout。SENSORD=c.SENSORID和cinout。CheckTime>=dateadd(小时,6,转换(datetime,转换(日期,c.CheckTime(((签入,(从CHECKINOUT cinout中选择max(CHECKTIME(,其中cinout。USERID=c.USERID和cinout。SENSORD=c.SENSORID和cinout。CheckTime<=dateadd(小时,29,转换(datetime,转换(日期,c.CheckTime(((COut来自CHECKINOUT c按c.USERID、c.SENSORID、convert(date,CHECKTIME(、datename(DW,CHECKTIME(分组)温度)出席内部加入u.USERID=attance.USERID上的userinfo u,其中u.USERID=77$

相关内容

  • 没有找到相关文章

最新更新