你好,第一次发帖!:(
我有一个表,它输出这个示例数据,但对于许多用户和不同的日期范围:-
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$