Использование 0
в качестве основы (что соответствует 1900-01-01
) не очень интуитивно понятно или самодокументировано.Кроме того, написание запроса, предполагающего, что он будет выполняться только во вторник, немного опасно;мы можем сделать так, чтобы при необходимости повторного запуска в среду или четверг он все равно давал правильные результаты.
-- first, let's make sure we know what weekday is a Sunday
DECLARE @OriginalDateFirst int = @@DATEFIRST;
IF @OriginalDateFirst <> 7
BEGIN
SET DATEFIRST 7;
END
-- let's figure out today
DECLARE @today datetime = CONVERT(date, GETDATE()),
@weekday int = DATEPART(WEEKDAY, GETDATE());
-- if weekday is 3 (Tuesday), the previous Sunday is today -2,
-- and the Sunday before that is today -9
-- if weekday is 4 (Wednesday), the days are -3, -10
-- if weekday is 5 (Thursday), the days are -4, -11
-- and so on
-- so the range is -6-@weekday to 1-@weekday
DECLARE @MostRecentSunday datetime = DATEADD(HOUR, 23, DATEADD(DAY, 1-@weekday, @today)),
@PreviousSunday datetime = DATEADD(HOUR, 21, DATEADD(DAY, -6-@weekday, @today));
-- make sure this is what you want:
SELECT @PreviousSunday, @MostRecentSunday;
-- now your query just says:
... WHERE startdatetime >= @PreviousSunday
AND startdatetime <= @MostRecentSunday;
-- let's put the datefirst setting back
IF @OriginalDateFirst <> 7
BEGIN
SET DATEFIRST @OriginalDateFirst;
END
Да, это определенно больше кода (хотя вы можете сжать его совсем немного, если вынапример, и если вы знаете, что никто не ошибается с DATEFIRST
, вы также можете очистить часть этой логики).
Но я большой поклонник создания самодокументируемого кода вместо краткого / загадочного.