Сводный запрос будет возвращать данные только из «FromDate», а не между двумя датами - PullRequest
0 голосов
/ 21 октября 2018

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

DECLARE @_DateFrom DATETIME
DECLARE @_DateTo DATETIME
DECLARE @_SerialNumber NVARCHAR(MAX)

SET @_DateFrom = '2018-10-20 00:00:00'
SET @_DateTo = '2018-10-21 00:00:00'
SET @_SerialNumber = '2209'

    SELECT [Serial], 
       [Channel],
       [ReadingDate],
       [00:15],[00:30],[00:45],[01:00],[01:15],[01:30],[01:45],[02:00],[02:15],[02:30],[02:45],[03:00],
       [03:15],[03:30],[03:45],[04:00],[04:15],[04:30],[04:45],[05:00],[05:15],[05:30],[05:45],[06:00],
       [06:15],[06:30],[06:45],[07:00],[07:15],[07:30],[07:45],[08:00],[08:15],[08:30],[08:45],[09:00],
       [09:15],[09:30],[09:45],[10:00],[10:15],[10:30],[10:45],[11:00],[11:15],[11:30],[11:45],[12:00],
       [12:15],[12:30],[12:45],[13:00],[13:15],[13:30],[13:45],[14:00],[14:15],[14:30],[14:45],[15:00],
       [15:15],[15:30],[15:45],[16:00],[16:15],[16:30],[16:45],[17:00],[17:15],[17:30],[17:45],[18:00],
       [18:15],[18:30],[18:45],[19:00],[19:15],[19:30],[19:45],[20:00],[20:15],[20:30],[20:45],[21:00],
       [21:15],[21:30],[21:45],[22:00],[22:15],[22:30],[22:45],[23:00],[23:15],[23:30],[23:45],[00:00]
    FROM(
        SELECT 
            SerialNumber AS [Serial],
            ChannelName AS [Channel],
            (CASE WHEN 
                    CAST(ReadingDate AS DATE) > CAST(@_DateFrom AS DATE) 
                    THEN CAST(@_DateFrom AS DATE) 
                    ELSE CAST(ReadingDate AS DATE)
            END) AS [ReadingDate],
            CAST(ReadingDate AS TIME) AS [ReadingTime],
            ChannelValue AS [Value]
        FROM [UriData]
        WHERE ReadingDate BETWEEN @_DateFrom AND @_DateTo       
        AND SerialNumber = @_SerialNumber
        AND ChannelName IN (SELECT ChannelName FROM [Staging].[ActiveChannels]) 
        ) AS [Raw]
    PIVOT
    (
        MAX( [Value] ) FOR [ReadingTime] IN( [00:15],[00:30],[00:45],[01:00],[01:15],[01:30],[01:45],[02:00],
                                         [02:15],[02:30],[02:45],[03:00],[03:15],[03:30],[03:45],[04:00],
                                         [04:15],[04:30],[04:45],[05:00],[05:15],[05:30],[05:45],[06:00],
                                         [06:15],[06:30],[06:45],[07:00],[07:15],[07:30],[07:45],[08:00],
                                         [08:15],[08:30],[08:45],[09:00],[09:15],[09:30],[09:45],[10:00],
                                         [10:15],[10:30],[10:45],[11:00],[11:15],[11:30],[11:45],[12:00],
                                         [12:15],[12:30],[12:45],[13:00],[13:15],[13:30],[13:45],[14:00],
                                         [14:15],[14:30],[14:45],[15:00],[15:15],[15:30],[15:45],[16:00],
                                         [16:15],[16:30],[16:45],[17:00],[17:15],[17:30],[17:45],[18:00],
                                         [18:15],[18:30],[18:45],[19:00],[19:15],[19:30],[19:45],[20:00],
                                         [20:15],[20:30],[20:45],[21:00],[21:15],[21:30],[21:45],[22:00],
                                         [22:15],[22:30],[22:45],[23:00],[23:15],[23:30],[23:45],[00:00])
    ) AS pvt    
    ORDER BY ReadingDate DESC, Channel, [Serial]

Запрос возвращает данные только для переменной @_DateFrom и не возвращает никаких других данных, кроме этих, то есть между двумя датами, поэтому приведенный выше запрос будет возвращать толькоданные для '2018-10-20 00:00:00'.Я пытался добавить его на SQL Fiddle, но сайт, похоже, снова не работает.У меня такое ощущение, что причиной этого является заявление case, но я изо всех сил пытаюсь его исправить.

Итак, у меня есть ссылка Dropbox, в которой есть запрос, используемые данные и ожидаемый результат https://www.dropbox.com/sh/odtn35jo6sjhqde/AAChn5Fw7OgrCIyI70XiJ-msa?dl=0

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Я догадываюсь, что ReadingDate - это столбец DATETIME.если правда.Тогда ваша проблема в этой строке:

SET @_DateFrom = '2018-10-20 00:00:00'
SET @_DateTo = '2018-10-21 00:00:00'

вы начинаете с начала 2018-10-20 12:00 и заканчиваете в 2018-10-21 в полночь (это24 часа).если вы хотите включить 2018-10-21 в свои результаты, вы должны сделать что-то вроде этого:

SET @_DateFrom = '2018-10-20 00:00:00'
SET @_DateTo = '2018-10-21 23:59:59'

Итак, вы начинаете в 2018-10-20 12:00, а заканчиваете в 2018-10-21 23:59:59 вечера (что ближе к 12:00).(Это 48 часов, более или менее).

Это будет включать обе записи даты.

0 голосов
/ 27 октября 2018
declare @_SerialNumber NVARCHAR(MAX) = '2209'   
DECLARE @_DateFrom DATETIME
DECLARE @_DateTo DATETIME

SET @_DateFrom = '2018-10-01 00:15:00'
SET @_DateTo = '2018-10-28 00:15:00'


    SELECT [Serial], 
       [Channel],
       [ReadingDate],
       [00:15],[00:30],[00:45],[01:00],[01:15],[01:30],[01:45],[02:00],[02:15],[02:30],[02:45],[03:00],
       [03:15],[03:30],[03:45],[04:00],[04:15],[04:30],[04:45],[05:00],[05:15],[05:30],[05:45],[06:00],
       [06:15],[06:30],[06:45],[07:00],[07:15],[07:30],[07:45],[08:00],[08:15],[08:30],[08:45],[09:00],
       [09:15],[09:30],[09:45],[10:00],[10:15],[10:30],[10:45],[11:00],[11:15],[11:30],[11:45],[12:00],
       [12:15],[12:30],[12:45],[13:00],[13:15],[13:30],[13:45],[14:00],[14:15],[14:30],[14:45],[15:00],
       [15:15],[15:30],[15:45],[16:00],[16:15],[16:30],[16:45],[17:00],[17:15],[17:30],[17:45],[18:00],
       [18:15],[18:30],[18:45],[19:00],[19:15],[19:30],[19:45],[20:00],[20:15],[20:30],[20:45],[21:00],
       [21:15],[21:30],[21:45],[22:00],[22:15],[22:30],[22:45],[23:00],[23:15],[23:30],[23:45],[00:00]
    FROM(
        SELECT 
            SerialNumber AS [Serial],
            ChannelName AS [Channel],
            (CASE WHEN 
                    CAST(ReadingDate AS TIME) = '00:00:00'  
                    THEN CAST(DATEADD(DAY, -1, ReadingDate) AS DATE)  
                    ELSE CAST(ReadingDate AS DATE)
            END) AS [ReadingDate],
            CAST(ReadingDate AS TIME) AS [ReadingTime],
            ChannelValue AS [Value]
        FROM [Staging].[UriData]
        WHERE ReadingDate BETWEEN @_DateFrom AND @_DateTo
        AND SerialNumber = @_SerialNumber   
        and ChannelName = 'v1'
        ) AS [Raw]

    PIVOT
    (
        MAX( [Value] ) FOR [ReadingTime] IN([00:15],[00:30],[00:45],[01:00],[01:15],[01:30],[01:45],[02:00],
                                         [02:15],[02:30],[02:45],[03:00],[03:15],[03:30],[03:45],[04:00],
                                         [04:15],[04:30],[04:45],[05:00],[05:15],[05:30],[05:45],[06:00],
                                         [06:15],[06:30],[06:45],[07:00],[07:15],[07:30],[07:45],[08:00],
                                         [08:15],[08:30],[08:45],[09:00],[09:15],[09:30],[09:45],[10:00],
                                         [10:15],[10:30],[10:45],[11:00],[11:15],[11:30],[11:45],[12:00],
                                         [12:15],[12:30],[12:45],[13:00],[13:15],[13:30],[13:45],[14:00],
                                         [14:15],[14:30],[14:45],[15:00],[15:15],[15:30],[15:45],[16:00],
                                         [16:15],[16:30],[16:45],[17:00],[17:15],[17:30],[17:45],[18:00],
                                         [18:15],[18:30],[18:45],[19:00],[19:15],[19:30],[19:45],[20:00],
                                         [20:15],[20:30],[20:45],[21:00],[21:15],[21:30],[21:45],[22:00],
                                         [22:15],[22:30],[22:45],[23:00],[23:15],[23:30],[23:45],[00:00])

    ) AS pvt    
    ORDER BY ReadingDate DESC, Channel, [Serial]
0 голосов
/ 22 октября 2018

Исходя из этой логики:

       (CASE WHEN 
                CAST(ReadingDate AS DATE) > CAST(@_DateFrom AS DATE) 
                THEN CAST(@_DateFrom AS DATE) 
                ELSE CAST(ReadingDate AS DATE)
        END) AS [ReadingDate],

Если ReadingDate когда-либо больше , чем @_DateFrom, тогда оно установлено на @_DateFrom.Казалось бы, виновник.

...