Получение выборки по датам прошлой недели в MSSQL

Задача заключается в том, чтобы получить данные таблиц, в которых дата создания - ПРОШЛАЯ неделя(не последние 7 календарных дней, а именно последняя календарная неделя, относительно текущей). Это вариант решения на MYSQL:

SELECT * 
FROM `timesheet` 
WHERE `date` BETWEEN (CURDATE() - INTERVAL 1 WEEK - INTERVAL WEEKDAY(CURDATE()) DAY)
             AND 
                     (CURDATE() - INTERVAL WEEKDAY(CURDATE()) DAY - INTERVAL 1 SECOND)
GROUP BY `date`

однако на MSSQL некоторых функции по времени отсутствуют...


Ответы (1 шт):

Автор решения: Andrew Nikolaev

Ваш запрос будет выглядеть так

SELECT * 
FROM [timesheet] 
WHERE [date] BETWEEN 
    DATEADD(WEEK, -1, DATEADD(WEEKDAY, 2 - DATEPART(WEEKDAY, CONVERT(VARCHAR, GETDATE(), 112)), CONVERT(VARCHAR, GETDATE(), 112))) 
    AND
    DATEADD(SECOND, -1, DATEADD(WEEKDAY, 2 - DATEPART(WEEKDAY, CONVERT(VARCHAR, GETDATE(), 112)), CONVERT(VARCHAR, GETDATE(), 112)))

Для удобства лучше заменить CONVERT(VARCHAR, GETDATE(), 112) на какую то переменную, чтобы запись была короче.

DECLARE @DateWithoutTime DATETIME = CONVERT(VARCHAR, GETDATE(), 112) -- Дата без времени

SELECT * 
FROM [timesheet] 
WHERE [date] BETWEEN 
    DATEADD(WEEK, -1, DATEADD(WEEKDAY, 2 - DATEPART(WEEKDAY, @DateWithoutTime), @DateWithoutTime)) 
    AND
    DATEADD(SECOND, -1, DATEADD(WEEKDAY, 2 - DATEPART(WEEKDAY, @DateWithoutTime), @DateWithoutTime))

Замечу, что 2 (двойка) в запросе не случайна, потому что дни недели начинаются с воскресения, а не с понедельника как у "нас", поэтому двигаем на +1 вперёд, чтобы неделя считалась с понедельника по воскресение.

Таким образом, сейчас 2022-11-24 19:15, выполнив запрос

DECLARE @DateWithoutTime DATETIME = CONVERT(VARCHAR, GETDATE(), 112) -- Дата без времени    
SELECT  
    DATEADD(WEEK, -1, DATEADD(WEEKDAY, 2 - DATEPART(WEEKDAY, @DateWithoutTime), @DateWithoutTime)) 
    ,
    DATEADD(SECOND, -1, DATEADD(WEEKDAY, 2 - DATEPART(WEEKDAY, @DateWithoutTime), @DateWithoutTime))

Получим диапазон 2022-11-14 00:00:00.000 - 2022-11-20 23:59:59.000

→ Ссылка