Поднять флаг, если дата превышает 24 часа, исключая выходные

#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, чтобы быть в понедельник в этом случае. Я отредактирую свой ответ через мгновение.