简体   繁体   English

交叉使用案例陈述和选择顶部

[英]Using Case Statements with a Cross Apply and Select Top

In the below code, I want the first line of the Select Top to look like this if the hour of the enddate is equal to 0. 在下面的代码中,如果结束日期的小时等于0,我希望Select Top的第一行看起来像这样。

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

But I want it to look like this if the hour of the enddate is not equal to 0. 但是,如果结束日期的小时数不等于0,我希望它看起来像这样。

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

But, I'm struggling to determine how you incorporate a case statement into this, since it would need to sit within the cross apply. 但是,我正在努力确定如何将案例陈述并入其中,因为它需要放在交叉适用范围内。

 --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

Replace this: 替换为:

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

With this: 有了这个:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM