Если я запускаю следующий запрос Oracle SQL:
SELECT foo_number
FROM bar_log;
У меня есть записи, которые выглядят так:
20240621.16^123ABCD^SEARCH_PROFILE^AB1C3^9999
Первая строка (20240621.16) представляет собой временную метку (ГГГГММДД.ЧЧ); час отображается в 24-часовом формате, но часы с однозначными цифрами не имеют ведущего нуля. Я хотел бы взять текущую дату/время, преобразовать ее, чтобы отразить этот формат метки времени, в качестве переменной и использовать переменную в предложении WHERE для поиска соответствующих записей. Каким будет лучший подход для достижения этой цели?
Возьмите подстроку до символа перед первым символом ^
, а затем используйте TO_DATE
:
SELECT TO_DATE(
SUBSTR(foo_number, 1, INSTR(foo_number, '^') - 1),
'YYYYMMDD"."HH24'
) AS dt
FROM bar_log;
Что для примера данных:
CREATE TABLE bar_log (foo_number) AS
SELECT '20240621.16^123ABCD^SEARCH_PROFILE^AB1C3^9999' FROM DUAL UNION ALL
SELECT '20240621.1^123ABCD^SEARCH_PROFILE^AB1C3^9999' FROM DUAL;
Выходы:
Если вы хотите фильтровать по SYSDATE
, вы можете использовать:
SELECT foo_number
FROM bar_log
WHERE TO_DATE(
SUBSTR(foo_number, 1, INSTR(foo_number, '^') - 1),
'YYYYMMDD"."HH24'
) <= SYSDATE;
Какие выходы:
Вы можете использовать to_char()
для преобразования даты/времени в строку. Обычно элемент формата HH24
дает ведущие нули, что вам не нужно; но если вы предварите этот элемент модификатором формата FM
, это не так.
Сейчас в 23:00, это дает «23» для часа; через час он выдаст «0» для полночи, а не «00».
select to_char(sysdate, 'YYYYMMDD.FMHH24') from dual
select to_char(sysdate + 1/24, 'YYYYMMDD.FMHH24') from dual
select to_char(sysdate + 6/24, 'YYYYMMDD.FMHH24') from dual
Затем вы можете использовать это по своему усмотрению:
...
where foo_number like to_char(sysdate, 'YYYYMMDD.FMHH24') || '^%'
Или, что еще проще, встраивание фиксированных символов в формат, чтобы вам не приходилось объединять их:
...
where foo_number like to_char(sysdate, 'YYYYMMDD.FMHH24"^%"')
Спасибо; это отлично работает для моего приложения!