Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL Server中获取表列中缺少的日期_Sql Server_Function - Fatal编程技术网

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子句中条款……谢谢