SQL/POSTGRESQL. CASE с разбитием суток на 12 часов с переходом через 00:00 часов

есть запрос:

SELECT
                sample.elementid,
                sample.sampleid,
                sample.samplestate,
                sample.sampletime,
             --point.elementcode,
                json_array_elements ( qualityindicators :: json -> 'Elements' ) -> 'Attributes' -> 4 -> 'Value' -> 'Attributes' -> 7 -> 'Value' ->> 'Value' qi,
                ( json_array_elements ( qualityindicators :: json -> 'Elements' ) -> 'Attributes' -> 0 -> 'Value' ->> 'Value' ) :: NUMERIC RESULT,
                json_array_elements ( qualityindicators :: json -> 'Elements' ) -> 'Attributes' -> 3 -> 'Value' -> 'Attributes' -> 1 -> 'Value' ->> 'Value' uom 
             FROM 
                qualitymanagement_sample sample 
             where samplestate= 'Approved'

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

как из этого диапазона значений разбить данные на: 1 смена - 19:00 - 07:00 ( sample.sampletime ) 2 смена - 7:00 - 19:00

в силу неопытности, не получается сделать CASE с помощью присваивания sampletime переменной и поиск через нее.

Вопрос решен, по итогу получилось то, что я хотел.

    SELECT works.elementid,
    works.sampleid,
    works.samplestate,
    works.sampletime::time(0),
    works.elementcode, 
    
         
    CASE
       WHEN work_ship='1'  THEN '1 смена'
        WHEN work_ship='3'  THEN '1 смена'
       WHEN work_ship='2'  THEN '2 смена'     
      END AS shift
    ,works.qi
    ,works.result
    ,works.uom
FROM
(SELECT
    sample.elementid,
    sample.sampleid,
    sample.samplestate,
    sample.sampletime,
    point.elementcode,
    --extract(hour from sample.sampletime),
    2 - floor((extract(hour from sampletime) - 7) / 12) work_ship, --- если work_ship равен 1 или 3, то это первая смена, иначе 2 вторая смена
     json_array_elements ( qualityindicators :: json -> 'Elements' ) -> 'Attributes' -> 4 -> 'Value' -> 'Attributes' -> 7 -> 'Value' ->> 'Value' qi,
     ( json_array_elements ( qualityindicators :: json -> 'Elements' ) -> 'Attributes' -> 0 -> 'Value' ->> 'Value' ) :: NUMERIC RESULT,
     json_array_elements ( qualityindicators :: json -> 'Elements' ) -> 'Attributes' -> 3 -> 'Value' -> 'Attributes' -> 1 -> 'Value' ->> 'Value' uom          
     FROM 
     qualitymanagement_sample sample 
      INNER JOIN      qmcontrolpoints_controlpoint point      ON        point.elementid = sample.controlpoint
     where samplestate= 'Approved' ) works
  where works.sampletime >= @starttime and works.sampletime <= @endtime

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


Ответы (1 шт):

Автор решения: Mike

Получайте часы из даты с помощью extract(hour from sampletime). Соответственно номер смены можно получить формулой 2 - floor((extract(hour from sampletime) - 7) / 12)

→ Ссылка