С прошлого воскресенья до предстоящего воскресенья со временем

Я пытаюсь получить последнее воскресенье в 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

Это может помочь stackoverflow.com/questions/23020162/…

Bart McEndree 26.08.2024 20:56

Зачем тебе 2:59 утра? Что, если что-то произойдет в 2:59:30, или 2:59:59, или 2:59:59,9999999? Лучше искать время начала текущей недели (>=) и время начала следующей недели (<).

testing-for-ya 26.08.2024 21:27

@testing-for-ya, я знаю, что это очень странная просьба, но об этом спрашивали, и это не было моим решением.

852post 26.08.2024 21:29

Ну определенно не делайте ничего из этого: convert(char(12), getdate())

testing-for-ya 26.08.2024 21:42

@BartMcEndree Похоже, этот вопрос касается MySQL, а не SQL Server.

testing-for-ya 26.08.2024 21:42

Должен ли ответ быть другим, если его спросить до 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.)

T N 27.08.2024 00:15

@TN, это будет с 3 утра

852post 27.08.2024 02:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
7
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала найдите сегодня в 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));

Результаты:

Стартдиапазон ПравильныйКонец ХокиЭнд 2024-08-25 03:00:00.000 2024-09-01 03:00:00.000 2024-09-01 02:59:00.000

Если вы хотите понедельник вместо воскресенья, просто измените 1 - в строке 4 на 2 -:

Другие вопросы по теме