SQL Server: разница в днях для двух дат в отдельных строках

Я использую SQL Server 2012 и в настоящее время работаю над отчетом, который просит меня найти разницу в днях между двумя датами.

По сути, для конкретного ReportID я пытаюсь найти разницу в днях между (ReportCompletedDate когда ReportType = 'PaperReceived') - (ReportCompletedDate когда ReportType = 'Form Completed')

Я попытался привести некоторые записи ниже...

ReportID   ReportType       ReportCompletedDate  
-------------------------------------------------
450        PaperReceived      9/5/2013
450        Form Completed     8/13/2013
451        PaperReceived      9/7/2013
451        Form Completed     7/12/2013
452        PaperReceived      10/6/2013
452        Form Completed     3/13/2013

Итак, например, для ReportID = 450 я хочу получить 9/5/2013 - 8/13/2013 в днях.

Если бы кто-нибудь также знал, как это сделать для календарных и рабочих дней, это было бы здорово... но, по крайней мере, календарные дни должны быть в порядке.

Я не уверен, как это сделать, обычно, когда две даты совпадают, мне легче понять, но я не уверен, как это сделать, когда даты находятся в разных строках. Любые советы будут с радостью оценены.


person smul86    schedule 23.03.2017    source источник


Ответы (2)


Вы можете выполнить самосоединение, чтобы оно отображалось в «одной строке». Как это:

SELECT DateDiff(day,BASE.ReportCompleteDate, FORM.ReportCompleteDate) as Diff
FROM TABLE_NAME_YOU_DID_NOT_SAY BASE
LEFT JOIN TABLE_NAME_YOU_DID_NOT_SAY FORM ON BASE.ReportId = FORM.ReportID AND FORM.ReportType = 'Form Completed'
WHERE BASE.ReportType = 'PaperRecieved'
person Hogan    schedule 23.03.2017
comment
Возможно, вам придется добавить часть даты как «день» в инструкцию DATEDIFF. - person Abdullah Dibas; 23.03.2017
comment
@AbdullahDibas спасибо - да, я давно не использовал datediff - person Hogan; 24.03.2017
comment
@Hogan Спасибо, это было то, что мне было нужно!! Также Тай Абдулла. - person smul86; 24.03.2017

Пожалуйста, найдите ниже один из подходов...

SELECT RCVD.REPORTID
    , DATEDIFF(DAY, RCVD.REPORTCOMPLETEDDATE, CMPLD.REPORTCOMPLETEDDATE) DAY_DIFF
FROM (
    SELECT REPORTID
        , REPORTCOMPLETEDDATE
    FROM REPORTS
        WHERE REPORTTYPE = 'PaperReceived'
) RCVD
    JOIN (
    SELECT REPORTID
        , REPORTCOMPLETEDDATE
    FROM REPORTS
        WHERE REPORTTYPE = 'Form Completed'
) CMPLD
    ON RCVD.REPORTID = CMPLD.REPORTID
person Pons    schedule 23.03.2017
comment
Есть ли способ адаптировать это, чтобы получать строго рабочие дни вместо календарных? - person smul86; 29.03.2017