Заявление о случае поля времени

#sql #database #sql-server-2016

#sql #База данных #sql-server-2016

Вопрос:

Используя этот оператор case, и может потребоваться некоторая помощь с первым условием:

  case
    when convert(varchar, tblrelease.releaseddt, 108) BETWEEN '22:00:00' AND '06:00:00' then '10PM to 6AM' -- 1st
    when convert(varchar, tblrelease.releaseddt, 108) BETWEEN '06:00:00' AND '14:00:00' then '6AM to 2PM' -- 2nd
    when convert(varchar, tblrelease.releaseddt, 108) BETWEEN '14:00:00' AND '22:00:00' then '2PM to 10PM' -- 3rd 

        else 'UNDEFINED'
end AS [Shift],
 

Первое условие case не возвращает ‘с 10 вечера до 6 утра’. Он должен возвращать значение, как указано. Пожалуйста, ознакомьтесь с результатами примерной таблицы:

введите описание изображения здесь

tblrelease.releaseddt = (smalldatetime, null)

Комментарии:

1. Пометьте свой вопрос базой данных, которую вы используете. Кроме того, объясните, что должна делать логика.

Ответ №1:

Основываясь на синтаксисе, я собираюсь предположить, что вы используете SQL Server. Вероятно, самый простой способ обработки этого кода — сосредоточиться на часах:

 (case when datepart(hour, tblrelease.releaseddt) between 6 and 13
      then '6AM to 2PM'
      when datepart(hour, tblrelease.releaseddt) between 14 and 20
      then '2PM to 10PM'
      when tblrelease.releaseddt is not null          
      then '10PM to 6AM'
      else 'UNDEFINED'
 end) as Shift,
 

Вы также можете использовать time :

 (case when convert(time, tblrelease.releaseddt) >= '06:00:00' and
           convert(time, tblrelease.releaseddt) < '14:00:00' 
       then '6AM to 2PM' -- 2nd
       when convert(time, tblrelease.releaseddt) >= '14:00:00' and
            convert(time, tblrelease.releaseddt) < '22:00:00' 
      when tblrelease.releaseddt is not null          
      then '10PM to 6AM'
      else 'UNDEFINED'
 end) as Shift,
 

Это позволяет обойти проблему полуночи, если сначала посмотреть на две другие смены. Обратите внимание, что для этого нет причин преобразовывать в строку. И BETWEEN не рекомендуется. Ваш код неоднозначен в отношении того, где должны проходить границы.

Комментарии:

1. Небольшое уточнение по этой последней части: BETWEEN включает обе крайности, поэтому, если, например, время ровно 2 часа дня, у вас есть два «правильных» варианта, и результат будет зависеть от порядка ваших условий. @jr7138, вам нужно исключить одну из крайностей, как это сделал Гордон.

2. Кстати, @Gordon, в вашем первом коде '2PM to 10PM' условие является неполным.

3. Спасибо, Гордон. Да, Эндрю, я увидел условие и исправил его со своей стороны. Это работает так, как должно. Спасибо за вашу помощь.

Ответ №2:

Разделите запрос до и после полуночи

  case
    when (convert(varchar, tblrelease.releaseddt, 108) BETWEEN '22:00:00' AND '23:59:59') OR 
         (convert(varchar, tblrelease.releaseddt, 108) BETWEEN '00:00:00' AND '06:00:00') then '10PM to 6AM' -- 1st
    when convert(varchar, tblrelease.releaseddt, 108) BETWEEN '06:00:00' AND '14:00:00' then '6AM to 2PM' -- 2nd
    when convert(varchar, tblrelease.releaseddt, 108) BETWEEN '14:00:00' AND '22:00:00' then '2PM to 10PM' -- 3rd 

        else 'UNDEFINED'
end AS [Shift],