Я пытаюсь получить последнее воскресенье в 3 часа ночи до предстоящего воскресенья в 2:59 ночи.
Ниже приведено то, что у меня есть, но оно не дает точного определения предстоящего воскресенья. В идеале всякий раз, когда я запускаю этот запрос, он должен возвращать ожидаемый результат. Например, если я запускаю этот запрос сегодня, он должен вернуть StartDate: 25.08.2024, 3:00 и EndDate: 01.09.2024, 2:59, а если я запущу на следующей неделе, он должен предоставить мне StartDate: 01.09.2024 3:00 и Дата окончания: 08.09.2024 2:59
Одна из основных проблем заключается в том, что если бы я выполнил этот запрос в воскресенье. В некоторых местах неделя начинается в воскресенье, а в других — в понедельник, поэтому запрос должен учитывать это и иметь результат «воскресенье — воскресенье».
select dateadd(hour,3,dateadd(minute, 00, DATEADD(dd, DATEDIFF(dd,-1,GETDATE())/7*7,-1))) StartDate,
dateadd(hour,+2,dateadd(minute, +59, dateadd(day, ((15-@@datefirst) - datepart(dw, getdate())) % 7, convert(char(12), getdate())))) EndDate
Зачем тебе 2:59 утра? Что, если что-то произойдет в 2:59:30, или 2:59:59, или 2:59:59,9999999? Лучше искать время начала текущей недели (>=
) и время начала следующей недели (<
).
@testing-for-ya, я знаю, что это очень странная просьба, но об этом спрашивали, и это не было моим решением.
Ну определенно не делайте ничего из этого: convert(char(12), getdate())
@BartMcEndree Похоже, этот вопрос касается MySQL, а не SQL Server.
Должен ли ответ быть другим, если его спросить до 03:00 и после 03:00 в воскресенье? Для SQL Server 2022 или более поздней версии может пригодиться функция DATE_BUCKET()
— пример DATE_BUCKET (week, 1, GETDATE(), CAST('20240107 03:00' AS DATETIME))
. Для более ранних версий SQL-сервера можно использовать комбинацию DATEDIFF()
, усечения и DATEADD()
, но мы должны выбрать опорное воскресенье перед любым ожидаемым значением даты — DATEADD(week, DATEDIFF(hour, '19000107 03:00', GETDATE())/168, '19000107 03:00')
Fiddle. (Можно также использовать минуты/1440 или секунды/86400.)
@TN, это будет с 3 утра
Сначала найдите сегодня в 3 часа ночи:
DECLARE @today datetime = DATEADD(HOUR, 3,
CONVERT(datetime, CONVERT(date, GETDATE())));
Затем возьмите нужный день недели (в данном случае воскресенье = 1) и вычислите предыдущий. Эта формула работает независимо от настроек DATEFIRST
.
DECLARE @PreviousSunday datetime = DATEADD(DAY,
1 - (DATEPART(WEEKDAY, @today) + @@DATEFIRST) % 7, @today);
Теперь вам просто нужно добавить неделю, чтобы получить другую границу (и вычесть минуту, используя DATEADD
, если необходимо, но это опрометчиво, поскольку вы пропустите данные, которые происходят между 2:59 и 3:00).
SELECT StartRange = @PreviousSunday,
ProperEnd = DATEADD(DAY, 7, @PreviousSunday),
HokeyEnd = DATEADD(MINUTE, -1, DATEADD(DAY, 7, @PreviousSunday));
Все вместе:
DECLARE @today datetime = DATEADD(HOUR, 3,
CONVERT(datetime, CONVERT(date, GETDATE())));
DECLARE @PreviousSunday datetime = DATEADD(DAY,
1 - (DATEPART(WEEKDAY, @today) + @@DATEFIRST) % 7, @today);
SELECT StartRange = @PreviousSunday,
ProperEnd = DATEADD(DAY, 7, @PreviousSunday),
HokeyEnd = DATEADD(MINUTE, -1, DATEADD(DAY, 7, @PreviousSunday));
Результаты:
Если вы хотите понедельник вместо воскресенья, просто измените 1 -
в строке 4 на 2 -
:
Это может помочь stackoverflow.com/questions/23020162/…