Дата запроса и конкретное время в предложении where - PullRequest
0 голосов
/ 22 октября 2018

Я ищу помощь в Oracle SQL.Мне нужно запросить дату и время в предложении where, чтобы найти данные смены на основе текущей даты.Есть 3 смены, с 5:00 до 13:00, с 13:00 до 21:00 и с 9:00 до 5:00 (утро следующего дня. Например

SELECT 'T1' AS SHIFT, WORK_CENTER, SUM(CASE WHEN AQL='PASS' THEN 1 ELSE 0) END AS AQL_PASSED
FROM Z_INSPECTION_DEFECTS
WHERE DATE_TIME >= TO_DATE((SELECT CONCAT(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY''), '' 5:00:00 '') FROM DUAL)  , ''DD-MON-YYYY HH:MI:SS '') AND
       DATE_TIME < TO_DATE((SELECT CONCAT(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY''), '' 1:00:00 '') FROM DUAL) , ''DD-MON-YYYY HH:MI:SS '')

Я не получаю никаких результатов по этому запросу. Поле даты и времени является отметкой времени наместное время Лос-Анджелеса.

1 Ответ

0 голосов
/ 22 октября 2018

Непосредственная проблема заключается в том, что вы ищете время после 5 утра и до 1 часа ночи, что логически означает, что ничего не совпадает - поскольку ни одно время не может выполнить оба сразу.Вместо этого вы можете использовать 24-часовое время:

WHERE DATE_TIME >= TO_DATE((SELECT CONCAT(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY''), '' 5:00:00 '') FROM DUAL)  , ''DD-MON-YYYY HH24:MI:SS '') AND
       DATE_TIME < TO_DATE((SELECT CONCAT(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY''), ''13:00:00 '') FROM DUAL) , ''DD-MON-YYYY HH24:MI:SS '')

Но есть и другие способы получить их, например, просто без запросов к dual:

WHERE DATE_TIME >= TO_DATE(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY'') || '' 5:00:00 '', ''DD-MON-YYYY HH24:MI:SS '') AND
       DATE_TIME < TO_DATE(TO_CHAR(CURRENT_DATE, ''DD-MON-YYYY'') || ''13:00:00 '', ''DD-MON-YYYY HH24:MI:SS '')

или с усечением иарифметика даты:

WHERE DATE_TIME >= TRUNC(CURRENT_DATE) + (5/24) AND
       DATE_TIME < TRUNC(CURRENT_DATE) + (13/24)

Вы действительно должны получать эти времена в целевом часовом поясе, хотя, например:

WHERE DATE_TIME >= FROM_TZ(CAST(TRUNC(CURRENT_DATE) + (5/24) AS TIMESTAMP), ''America/Los_Angeles'') AND
       DATE_TIME < FROM_TZ(CAST(TRUNC(CURRENT_DATE) + (13/24) AS TIMESTAMP), ''America/Los_Angeles'')

Вы должны быть осторожны с current_date, чтов вашем текущем сеансе часовой пояс, и sysdate, который находится в часовом поясе сервера.Если ваша сессия в формате UTC, то current_date может не дать вам того дня, который вы ожидаете.

(я застрял с экранированными одинарными кавычками, поскольку это в основном то, что у вас есть в вопросе, подразумевая, что вы, вероятно, выполняетеэто с динамическим SQL, нужно ли вам это другое дело. Если вы делаете это только для обеспечения смещения периода во время выполнения, тогда это не должно быть динамическим ...)

Вы можете увидетьсгенерированный раз из этих расчетов с:

select FROM_TZ(CAST(TRUNC(CURRENT_DATE) + (5/24) AS TIMESTAMP), 'America/Los_Angeles'),
       FROM_TZ(CAST(TRUNC(CURRENT_DATE) + (13/24) AS TIMESTAMP), 'America/Los_Angeles')
from dual;

FROM_TZ(CAST(TRUNC(CURRENT_DATE)+(5/24)ASTIMESTAM FROM_TZ(CAST(TRUNC(CURRENT_DATE)+(13/24)ASTIMESTA
------------------------------------------------- -------------------------------------------------
2018-10-22 05:00:00.000000000 AMERICA/LOS_ANGELES 2018-10-22 13:00:00.000000000 AMERICA/LOS_ANGELES
...