#sql #sql-server #datetime #case #date-arithmetic
#sql #sql-сервер #дата и время #случай #дата-арифметика
Вопрос:
У меня есть скорректированное требование к моему предыдущему вопросу, который GMB смог помочь разрешить.
В приведенном ниже запросе также необходимо исключить выходные дни (субботу и воскресенье)
select s.*,
case when enddte > dateadd(hh, 24, begindte)
then 1
else 0
end as flag
from shipment s
where ship_id = 14723
В принципе, если запись с dateadd была вставлена в пятницу в 3 часа дня, флаг ‘1’ не должен быть поднят в субботу в 3 часа дня, но в любое время после понедельника в 3 часа дня
Комментарии:
1. Какую базу данных вы используете, и какова схема отправки, пожалуйста?
2. Я использую MSSQL. Что касается полей для таблицы отгрузки, enddte и begindte являются полями даты и времени.
Ответ №1:
Вы можете настроить смещение в соответствии с днем недели begindte
:
set datefirst 1; -- Monday
select s.*,
case when enddte > dateadd(
day,
case datepart(weekday, begindte)
when 5 then 3 -- friday: add 3 days
when 6 then 2 -- saturday : add 2 day
else 1 -- else: add 1 day
end,
begindte
) then 1 else 0 end as flag
from shipment s
where ship_id = 14723;
Ответ №2:
Вам необходимо объединить ваш запрос с:
DATENAME(weekday,date)
Returns the weekday name for date entered (Sunday,Monday, …,Saturday).
Вот пример.
Так что в основном это что-то вроде этого:
select s.*,
case when enddte > dateadd(hh, 24, begindte) AND (DATENAME(weekday, enddte ) NOT IN ('Saturday','Sunday') OR (DATENAME(weekday, begindte ) = 'Friday' AND enddte > dateadd(hh, 72, begindte)))
then 1
else 0
end as flag
from shipment s
where ship_id = 14723
Комментарии:
1. Спасибо. Я использую MSSQL, который не поддерживает функцию DAYOFWEEK
2. Я обнаружил, что предложение GMBs работает. Когда я только что протестировал ваш, флаг был поднят (1), хотя этого не должно быть. Вот даты для этого примера. дата добавления: 2020-10-16 14:20:22.000 окончание: 2020-10-19 07:04:45.000
3. @VQB
begindte
имеет записи в выходные дни, такие как суббота или воскресенье?4. нет. Последние записи за неделю вводятся в пятницу. Следовательно, я предоставляю приведенный выше пример даты 16 октября, в то время как enddte приходится на понедельник 19 октября.
5. @VQB из ok вы уже вычисляете eddate, чтобы быть в понедельник в этом случае. Я отредактирую свой ответ через мгновение.