Получение выборки по датам прошлой недели в 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 шт):
Ваш запрос будет выглядеть так
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