Записи группы SQL по пользовательскому диапазону времени в неделю - PullRequest
0 голосов
/ 04 октября 2018

Это, вероятно, просто, но я постоянно обдумываю свои проблемы.

Мне нужно вытащить все записи в определенном диапазоне дат (январь - март 2018 г.), которые находятся между воскресеньем 12 вечера до пятницы 1 вечера.Сгруппировано по неделям

SELECT col1, 
       Sum(col2) 
FROM   (SELECT * 
        FROM   (SELECT col1, 
                       col2, 
                       Datename(dw, [date_col]) AS day_of_week, 
                       date_col 
                FROM   table 
                WHERE  Datename(dw, [update_date]) != 'Saturday' 
               --eliminate Saturday records 
               ) a 
        WHERE  ( Cast(update_date AS TIME) < '12:00' 
                 AND day_of_week != 'Sunday' ) 
       --eliminate Sunday records before noon 
       ) b 
WHERE  ( day_of_week != 'Friday' 
          OR Cast(update_date AS TIME) > '13:00' ) 

--eliminate Friday records after 1PM

Ответы [ 3 ]

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

Отредактировано, чтобы отразить правильные возвращаемые значения для DATEPART (dw, ...)

Вы можете выполнить логику, чтобы определить, какие комбинации дня / часа действительны внутри оператора CASE в подзапросе SELECT, а затемгруппировать по номеру недели во внешнем запросе.Это упростит предложение WHERE.Я нахожу этот стиль немного менее непрозрачным и легче поддерживать в долгосрочной перспективе.

Пример ниже был проверен на Microsoft SQL SERVER.

SELECT
    DATEPART(wk, Update_Date) AS GroupByWeek
    , col1
    , SUM(col2)
FROM (
    SELECT
        col1
        , col2
        , Update_Date
        , CASE
            WHEN DATEPART(dw, Update_Date) = 1 AND DATEPART(hh, Update_Date) >= 12 THEN 1
            WHEN DATEPART(dw, Update_Date) = 6 AND DATEPART(hh, Update_Date) < 13 THEN 1
            WHEN DATEPART(dw, Update_Date) BETWEEN 2 AND 5 THEN 1
            ELSE 0
        END AS FallsInWindow
    FROM table
) RowsInWindow
WHERE 
    RowsInWindow.Update_Date BETWEEN '2018-01-01' AND '2018-04-01'
    AND RowsInWindow.FallsInWindow = 1
GROUP BY
    DATEPART(wk, Update_Date)
    , col1
ORDER BY GroupByWeek
0 голосов
/ 04 октября 2018

Вы можете использовать следующее условие:

WHERE update_date >= '2018-01-01' -- between Jan 2018
AND   update_date <  '2018-04-01' -- and Mar 2018
AND (
    DATENAME(dw, update_date) = 'Sunday' AND CAST(update_date AS TIME) >= '12:00' OR
    DATENAME(dw, update_date) IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday') OR
    DATENAME(dw, update_date) = 'Friday' AND CAST(update_date AS TIME) < '13:00'
)
0 голосов
/ 04 октября 2018
SELECT col1, Sum(col2)
                FROM   [table] 
                WHERE  Datename(dw, [update_date]) <> 'Saturday'
                OR
                NOT ( Cast(update_date AS TIME) < '12:00' 
                      AND Datename(dw, [update_date]) == 'Sunday' )
                OR 
                NOT ( Datename(dw, [update_date]) == 'Friday' 
                      AND Cast(update_date AS TIME) > '13:00' )
group by col1, datepart(week, update_date);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...