#sql #oracle
#sql #Oracle
Вопрос:
У меня есть панель мониторинга, которая сообщает о производстве за каждый час смены. На панели инструментов есть фиксированные интервалы для каждого часа смены.
- Когда смена с 7 утра до 7 вечера, все в порядке.
- Когда смена длится с 7 вечера до 7 утра, у меня возникает проблема.
- с 7 вечера до 8 вечера все в порядке
- с 8 вечера до 9 вечера все в порядке
- с 9 вечера до 10 вечера все в порядке
- с 10 вечера до 11 вечера все в порядке
- с 11 вечера до 12 вечера все в порядке
- проблема с 12 вечера до 1 часа ночи — проблема в том, что когда вы входите в панель мониторинга в 7 вечера, я забираю производство для сегодняшнего производства с полуночи до 1 часа ночи. Как я могу закодировать свой sql, чтобы игнорировать данные с полуночи до 1 часа ночи до полуночи и выбирать их после полуночи?
Вот SQL, который я использую
select date_time_created,
ith.quantity
From ifsapp.inventory_transaction_hist2 ith
where TRANSACTION_CODE = 'OOREC'
and upper(ifsapp.Inventory_Part_API.Get_Unit_Meas('WW001',PART_NO) ) =upper( 'CS' )
and date_time_created -1 - 60*60*7/86400 >= to_date(to_char(sysdate -1,'DD/MM/YYYY') || ' 19:00:00','DD/MM/YYYY HH24:MI:SS')- 60*60*7/86400
and date_time_created - 60*60*7/86400 <= to_date(to_char(sysdate,'DD/MM/YYYY') || ' 19:59:59','DD/MM/YYYY HH24:MI:SS')- 60*60*7/86400
and userid='3520'
Спасибо
Комментарии:
1. Я не понимаю ваш запрос. Вы занимаетесь математикой много времени, но когда вы добавляете или вычитаете одно и то же влево и вправо, все это становится недействительным. В итоге получается, ГДЕ date_time_created = сегодня в 19:xx:xx . Но где время смены, о котором вы говорите? Я думал, что ваша таблица будет содержать что-то вроде start_shift и end_shift. Где это «для каждого часа» в вашем запросе? Пожалуйста, покажите образцы данных и ожидаемые результаты.
2. Я не понимаю, что вы имеете в виду
How can I code my sql to ignore data from midnight to 1am before midnight and select it after midnight?
. Можете ли вы предоставить некоторые образцы входных данных вместе с выводом, который вы ожидаете увидеть?3. Когда вы превращаете дату в символьную строку, манипулируете строкой, а затем превращаете ее обратно в дату, вы почти наверняка делаете что-то неправильно. Манипулируйте датами, используя только функции даты и алгебру … например, Trunc(sysdate) 7/24
Ответ №1:
с 7 вечера до 7 утра:
date_time_created between to_date( to_char(sysdate-1, 'ddmmyyyy') || '19:00:00', 'ddmmyyhh24:mi:ss')
AND to_date( to_char(sysdate, 'ddmmyyyy') || '07:00:00', 'ddmmyyhh24:mi:ss')
с 12 вечера до 1 часа ночи:
date_time_created between to_date( to_char(sysdate-1, 'ddmmyyyy') || '12:00:00', 'ddmmyyhh24:mi:ss')
AND to_date( to_char(sysdate, 'ddmmyyyy') || '01:00:00', 'ddmmyyhh24:mi:ss')
Ответ №2:
Я не совсем уверен, что вам нужно, но если вы хотите увидеть результаты текущей смены, надеюсь, этот пример поможет вам понять, что вам нужно сделать:
WITH dates AS (SELECT TRUNC(SYSDATE) 5.1/24 LEVEL/24 dt
FROM dual
CONNECT BY LEVEL <= 36)
-- end of generating some data for the following query to run against
SELECT dt,
CASE WHEN to_number(to_char(dt - 7/24, 'hh24')) < 12 THEN '7am-7pm'
ELSE '7pm-7am'
END shift
FROM dates
WHERE dt >= CASE WHEN to_number(to_char(SYSDATE - 7/24, 'hh24')) < 12 THEN TRUNC(SYSDATE -7/24) 7/24
ELSE TRUNC(SYSDATE -7/24) 19/24
END
AND dt < CASE WHEN to_number(to_char(SYSDATE - 7/24, 'hh24')) < 12 THEN TRUNC(SYSDATE -7/24) 19/24
ELSE TRUNC(SYSDATE -7/24) 31/24
END;
DT SHIFT
------------------- -------
06/10/2016 07:06:00 7am-7pm
06/10/2016 08:06:00 7am-7pm
06/10/2016 09:06:00 7am-7pm
06/10/2016 10:06:00 7am-7pm
06/10/2016 11:06:00 7am-7pm
06/10/2016 12:06:00 7am-7pm
06/10/2016 13:06:00 7am-7pm
06/10/2016 14:06:00 7am-7pm
06/10/2016 15:06:00 7am-7pm
06/10/2016 16:06:00 7am-7pm
06/10/2016 17:06:00 7am-7pm
06/10/2016 18:06:00 7am-7pm
И просто чтобы доказать, что для разных системных адресов отчет будет сгенерирован, я настроил запрос на использование разных «системных адресов» для имитации запуска в разное время дня:
WITH dates AS (SELECT TRUNC(SYSDATE) 5.1/24 LEVEL/24 dt
FROM dual
CONNECT BY LEVEL <= 36),
-- end of generating some data for the main query to run against
sys_dates AS (SELECT to_date('06/10/2016 20:10:23', 'dd/mm/yyyy hh24:mi:ss') sysdt FROM dual UNION ALL
SELECT to_date('06/10/2016 13:10:23', 'dd/mm/yyyy hh24:mi:ss') sysdt FROM dual UNION ALL
SELECT to_date('07/10/2016 01:10:23', 'dd/mm/yyyy hh24:mi:ss') sysdt FROM dual)
-- end of mimicking different sysdates that the report could be run against
-- - for testing purposes only
SELECT sd.sysdt run_time_of_report,
d.dt,
CASE WHEN to_number(to_char(d.dt - 7/24, 'hh24')) < 12 THEN '7am-7pm'
ELSE '7pm-7am'
END shift
FROM dates d
CROSS JOIN sys_dates sd
WHERE d.dt >= CASE WHEN to_number(to_char(sd.sysdt - 7/24, 'hh24')) < 12 THEN TRUNC(sd.sysdt -7/24) 7/24
ELSE TRUNC(sd.sysdt -7/24) 19/24
END
AND d.dt < CASE WHEN to_number(to_char(sd.sysdt - 7/24, 'hh24')) < 12 THEN TRUNC(sd.sysdt -7/24) 19/24
ELSE TRUNC(sd.sysdt -7/24) 31/24
END
ORDER BY sd.sysdt, d.dt;
RUN_TIME_OF_REPORT DT SHIFT
------------------- ------------------- -------
06/10/2016 13:10:23 06/10/2016 07:06:00 7am-7pm
06/10/2016 13:10:23 06/10/2016 08:06:00 7am-7pm
06/10/2016 13:10:23 06/10/2016 09:06:00 7am-7pm
06/10/2016 13:10:23 06/10/2016 10:06:00 7am-7pm
06/10/2016 13:10:23 06/10/2016 11:06:00 7am-7pm
06/10/2016 13:10:23 06/10/2016 12:06:00 7am-7pm
06/10/2016 13:10:23 06/10/2016 13:06:00 7am-7pm
06/10/2016 13:10:23 06/10/2016 14:06:00 7am-7pm
06/10/2016 13:10:23 06/10/2016 15:06:00 7am-7pm
06/10/2016 13:10:23 06/10/2016 16:06:00 7am-7pm
06/10/2016 13:10:23 06/10/2016 17:06:00 7am-7pm
06/10/2016 13:10:23 06/10/2016 18:06:00 7am-7pm
--
06/10/2016 20:10:23 06/10/2016 19:06:00 7pm-7am
06/10/2016 20:10:23 06/10/2016 20:06:00 7pm-7am
06/10/2016 20:10:23 06/10/2016 21:06:00 7pm-7am
06/10/2016 20:10:23 06/10/2016 22:06:00 7pm-7am
06/10/2016 20:10:23 06/10/2016 23:06:00 7pm-7am
06/10/2016 20:10:23 07/10/2016 00:06:00 7pm-7am
06/10/2016 20:10:23 07/10/2016 01:06:00 7pm-7am
06/10/2016 20:10:23 07/10/2016 02:06:00 7pm-7am
06/10/2016 20:10:23 07/10/2016 03:06:00 7pm-7am
06/10/2016 20:10:23 07/10/2016 04:06:00 7pm-7am
06/10/2016 20:10:23 07/10/2016 05:06:00 7pm-7am
06/10/2016 20:10:23 07/10/2016 06:06:00 7pm-7am
--
07/10/2016 01:10:23 06/10/2016 19:06:00 7pm-7am
07/10/2016 01:10:23 06/10/2016 20:06:00 7pm-7am
07/10/2016 01:10:23 06/10/2016 21:06:00 7pm-7am
07/10/2016 01:10:23 06/10/2016 22:06:00 7pm-7am
07/10/2016 01:10:23 06/10/2016 23:06:00 7pm-7am
07/10/2016 01:10:23 07/10/2016 00:06:00 7pm-7am
07/10/2016 01:10:23 07/10/2016 01:06:00 7pm-7am
07/10/2016 01:10:23 07/10/2016 02:06:00 7pm-7am
07/10/2016 01:10:23 07/10/2016 03:06:00 7pm-7am
07/10/2016 01:10:23 07/10/2016 04:06:00 7pm-7am
07/10/2016 01:10:23 07/10/2016 05:06:00 7pm-7am
07/10/2016 01:10:23 07/10/2016 06:06:00 7pm-7am
Вы можете видеть, что отчет по состоянию на 06/10/2016 20: 10:23 и 07/10/2016 01: 10:23 возвращает те же данные для смены с 7 вечера до 7 утра.