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)

