Использование описаний дел с перекрестным применением и выбором сверху - PullRequest
0 голосов
/ 06 ноября 2018

В приведенном ниже коде я хочу, чтобы первая строка Select Top выглядела следующим образом, если час конечной даты равен 0.

SELECT TOP ( ABS(DATEDIFF(HOUR, A.startdatetime, A.enddatetime) + 1))

Но я хочу, чтобы это выглядело так, если час окончания даты не равен 0.

SELECT TOP ( ABS(DATEDIFF(HOUR, A.startdatetime, A.enddatetime)))

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

 --Create my temporary table
    SELECT * into #Temporary
    FROM dbo.Census
    WHERE year(startdatetime) >= 2018
    ORDER BY startdatetime, pt_id

    --Use the Cross Apply to split out every day into every hour
    SELECT
    Date = CAST(D AS DATE)
    ,Hour = DATEPART(HOUR, D)
    ,A.pt_id
    ,cendate
    ,A.[locationid]
    ,A.[room-bed]
    ,startdatetime
    ,enddatetime
    ,minutes
    ,MyStartMinutes = 0
    ,MyEndMinutes = 0
    INTO #Temporary2
    FROM #Temporary A
    CROSS APPLY
    (
        SELECT TOP ( ABS(DATEDIFF(HOUR, A.startdatetime, A.enddatetime) + 1))
        D = DATEADD(HOUR, -1 + ROW_NUMBER() OVER ( ORDER BY ( SELECT NULL )), A.startdatetime)
    FROM master..spt_values n1
        ,master..spt_values n2
    ) B



 Sample Data
 Date       pt_id   cendate    loc  startdate       enddate          minutes
 10/9/2018  100     10/2/2018   A   10/1/2018 22:00 10/2/2018 0:35   155
 10/10/2018 100     10/2/2018   B   10/2/2018 0:35  10/2/2018 23:00  1345


 It should result in: 

 Date        Hour  loc     pt_id      (Start Time)       (End Time)
 10/9/2018   22    A      100        10/9/2018 22:00     10/9/2018 23:00
 10/9/2018   23    A      100        10/9/2018 23:00     10/10/2018 0:00
 10/10/2018  0     A      100        10/10/2018 0:00     10/10/2018 0:35
 10/10/2018  0     B      100        10/10/2018 0:35     10/10/2018 1:00

1 Ответ

0 голосов
/ 08 ноября 2018

Заменить это:

SELECT TOP ( ABS(DATEDIFF(HOUR, A.startdatetime, A.enddatetime) + 1))

С этим:

SELECT TOP (ABS(DATEDIFF(HOUR, A.startdatetime, A.enddatetime) + (CASE WHEN DATEPART(HOUR, A.enddatetime) = 0 THEN 1 ELSE 0 END)))
...