Как получить пропущенные даты в столбце таблицы в SQL Server - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть таблица со следующими записями

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-03,2019-02-07,2019-02-08,2019-02-10,2019-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

Это неверный результат. Пожалуйста, помогите мне найти решение

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Один из простых подходов - присоединить таблицу календаря к текущей таблице на дату, например, так:

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 может по-прежнему оставлять пробелы в имеющихся датах.

0 голосов
/ 21 февраля 2019

Сначала создайте свои записи о дате, а затем выполните левое соединение с вашей текущей записью.

    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
0 голосов
/ 21 февраля 2019

Переместите запрос WHERE с помощью LEFT JOIN, если хотите получить NULL записей.

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) 
                       AND TA.personid = 21 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...