Sql server 如何在SQL Server中获取表列中缺少的日期
我有一张有以下记录的桌子Sql server 如何在SQL Server中获取表列中缺少的日期,sql-server,function,Sql Server,Function,我有一张有以下记录的桌子 DateIn TimeIn ---------------------------- 2019-02-01 09:31:00.0000000 2019-02-02 09:35:00.0000000 2019-02-04 09:27:00.0000000 2019-02-05 09:34:00.0000000 2019-02-06 09:32:00.0000000 2019-02-09 09:38:00.0000000 2019-02-11 09:
DateIn TimeIn
----------------------------
2019-02-01 09:31:00.0000000
2019-02-02 09:35:00.0000000
2019-02-04 09:27:00.0000000
2019-02-05 09:34:00.0000000
2019-02-06 09:32:00.0000000
2019-02-09 09:38:00.0000000
2019-02-11 09:35:00.0000000
2019-02-12 15:09:00.0000000
2019-02-13 09:31:00.0000000
2019-02-14 09:35:00.0000000
2019-02-15 09:35:00.0000000
2019-02-16 09:37:00.0000000
2019-02-18 09:33:00.0000000
2019-02-19 09:31:00.0000000
因此2019-02-032019-02-072019-02-082019-02-102019-02-17是缺失的日期
所以我想得到以下格式的结果
DateIn TimeIn
----------------------------
2019-02-01 09:31:00.0000000
2019-02-02 09:35:00.0000000
2019-02-03 null
2019-02-04 09:27:00.0000000
2019-02-05 09:34:00.0000000
2019-02-06 09:32:00.0000000
2019-02-07 null
2019-02-08 null
2019-02-09 09:38:00.0000000
2019-02-10 null
2019-02-11 09:35:00.0000000
2019-02-12 15:09:00.0000000
2019-02-13 09:31:00.0000000
2019-02-14 09:35:00.0000000
2019-02-15 09:35:00.0000000
2019-02-16 09:37:00.0000000
2019-02-17 null
2019-02-18 09:33:00.0000000
2019-02-19 09:31:00.0000000
为此,我创建了“GetAllDates”函数,它返回给定日期之间的所有日期,并以以下方式使用此函数
Select
TA.DateIn, TA.TimeIn
from
[ES].[getAllDates]('20190201','20190228') DD
left outer join
[ES].[tblAttendance] TA on Cast(TA.DateIn as date) = cast(DD.date as date)
where
TA.PersonId = 21
此查询返回以下结果:
DateIn TimeIn
----------------------------
2019-02-01 09:31:00.0000000
2019-02-02 09:35:00.0000000
2019-02-04 09:27:00.0000000
2019-02-05 09:34:00.0000000
2019-02-06 09:32:00.0000000
2019-02-09 09:38:00.0000000
2019-02-11 09:35:00.0000000
2019-02-12 15:09:00.0000000
2019-02-13 09:31:00.0000000
2019-02-14 09:35:00.0000000
2019-02-15 09:35:00.0000000
2019-02-16 09:37:00.0000000
2019-02-18 09:33:00.0000000
2019-02-19 09:31:00.0000000
这不是正确的结果。。如果要获取空记录,请帮助我找到解决方案使用左连接移动WHERE查询
如果要获取空记录,请使用左连接移动WHERE查询
这里一种简单的方法是在日期将日历表左键连接到当前表,如下所示:
WITH dates AS (
select date from [ES].getAllDates('20190201','20190228')
)
SELECT
d.date,
t.TimeIn
FROM dates d
LEFT JOIN [ES].[tblAttendance] t
ON d.date = t.DateIn and t.PersonId = 21
ORDER BY
d.date;
@PSK的答案可能有效,假设您的tblAttendance表实际上已经有了每个日期的数据。如果没有,那么仅仅将WHERE限制移动到ON子句可能仍然会在当前的日期中留下一些漏洞。这里的一个简单方法是在日期将日历表左键连接到当前表,如下所示:
WITH dates AS (
select date from [ES].getAllDates('20190201','20190228')
)
SELECT
d.date,
t.TimeIn
FROM dates d
LEFT JOIN [ES].[tblAttendance] t
ON d.date = t.DateIn and t.PersonId = 21
ORDER BY
d.date;
@PSK的答案可能有效,假设您的tblAttendance表实际上已经有了每个日期的数据。如果没有,那么仅仅将WHERE限制移动到ON子句可能仍然会在当前的日期中留下一些漏洞。首先创建日期记录,然后将left连接到当前记录
GO
DECLARE @arrival_date date = '2019-01-01',
@leaving_date date = '2019-02-01'
;WITH DD AS (
SELECT @arrival_date as date_
UNION ALL
SELECT CAST(DATEADD(day,1,date_) as date)
FROM DD
WHERE date_ < @leaving_date
)
select DD.date_ as DateIn, TA.TimeIn as TimeIn from DD LEFT OUTER JOIN [ES].[tblattendance] TA
ON Cast(TA.datein AS DATE) = Cast(DD.date_ AS DATE)
AND TA.personid = 21
GO
首先创建日期记录,然后使左键与当前记录连接
GO
DECLARE @arrival_date date = '2019-01-01',
@leaving_date date = '2019-02-01'
;WITH DD AS (
SELECT @arrival_date as date_
UNION ALL
SELECT CAST(DATEADD(day,1,date_) as date)
FROM DD
WHERE date_ < @leaving_date
)
select DD.date_ as DateIn, TA.TimeIn as TimeIn from DD LEFT OUTER JOIN [ES].[tblattendance] TA
ON Cast(TA.datein AS DATE) = Cast(DD.date_ AS DATE)
AND TA.personid = 21
GO
请添加您的上述有问题查询的结果。请添加您的上述有问题查询的结果。我尝试了此操作,效果很好,但我在“dates”中使用了我的函数,并将where条件移动到On子句中…谢谢我尝试了此操作,效果很好,但我在“dates”中使用了我的函数,并将where条件移动到On子句中条款……谢谢