Непосредственная проблема заключается в том, что вы ищете время после 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