Во-первых, несколько интересующих элементов:
- Команда SQL Server
SET DATEFIRST
позволяет выбрать любой день недели в качестве первого дня недели, начиная с 1 (понедельник).) до 7 (воскресенье). - Вы можете запросить текущее значение этого параметра с помощью выражения
@@datefirst
. DATEPART(weekday, getdate())
вернет число длятекущий день недели, где 1 обозначает день, установленный SET DATEFIRST
, 2 обозначает день после и т. д.
Итак, предположим, я хочу ответить на вопрос: за сколько дней до некоторой произвольной даты @TestDate
был самый последний понедельник?Количество дней, прошедших с самого начала начала недели, составляет DATEPART(weekday, @TestDate) - 1
, а количество дней, прошедших между понедельником и началом недели, @@datefirst - 1
, поэтому количество дней, прошедших ссамый последний понедельник - сумма этих величин по модулю 7:
declare @TestDate date = convert(date, getdate());
declare @DaysPastMonday int = (@@datefirst + datepart(weekday, @TestDate) - 2) % 7;
С помощью этой информации вы можете очень легко получить диапазон дат:
declare @DateTo date = dateadd(day, -@DaysPastMonday, @TestDate);
declare @DateFrom date = dateadd(day, -7, @DateTo);
Но обратите внимание, что обе датыЯ выбрал здесь понедельники, а вы хотите с понедельника по воскресенье.Причина, по которой я сделал это таким образом, заключается в том, что если вы собираетесь просматривать поля, которые потенциально имеют компонент времени, а также дату (например, datetime
или datetime2
), и вы хотите использовать BETWEEN
, то вам нужно убедиться, что в вашей дате окончания указано самое позднее время дня, которое SQL Server может представлять.Я считаю более понятным использование диапазона дат, включающего дату начала и исключающего дату окончания.Таким образом, вместо выражения вроде этого:
x BETWEEN @DateFrom AND @DateTo
Вы бы написали свои запросы, чтобы использовать выражение вроде этого:
x >= @DateFrom AND x < @DateTo