Как переформатировать текущую дату/время в переменную для использования в предложении «где»

Если я запускаю следующий запрос Oracle SQL:

SELECT foo_number
FROM bar_log;

У меня есть записи, которые выглядят так:

20240621.16^123ABCD^SEARCH_PROFILE^AB1C3^9999

Первая строка (20240621.16) представляет собой временную метку (ГГГГММДД.ЧЧ); час отображается в 24-часовом формате, но часы с однозначными цифрами не имеют ведущего нуля. Я хотел бы взять текущую дату/время, преобразовать ее, чтобы отразить этот формат метки времени, в качестве переменной и использовать переменную в предложении WHERE для поиска соответствующих записей. Каким будет лучший подход для достижения этой цели?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Возьмите подстроку до символа перед первым символом ^, а затем используйте 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;

Выходы:

ДТ 2024-06-21 16:00:00 2024-06-21 01:00:00

Если вы хотите фильтровать по SYSDATE, вы можете использовать:

SELECT foo_number
FROM   bar_log
WHERE  TO_DATE(
         SUBSTR(foo_number, 1, INSTR(foo_number, '^') - 1),
         'YYYYMMDD"."HH24'
       ) <= SYSDATE;

Какие выходы:

FOO_NUMBER 20240621.16^123ABCD^SEARCH_PROFILE^AB1C3^9999 20240621.1^123ABCD^SEARCH_PROFILE^AB1C3^9999

рабочий пример

Ответ принят как подходящий

Вы можете использовать to_char() для преобразования даты/времени в строку. Обычно элемент формата HH24 дает ведущие нули, что вам не нужно; но если вы предварите этот элемент модификатором формата FM, это не так.

Сейчас в 23:00, это дает «23» для часа; через час он выдаст «0» для полночи, а не «00».

select to_char(sysdate, 'YYYYMMDD.FMHH24') from dual
TO_CHAR(SYSDATE,'ГГГГММДД.FMHH24') 20240621.23
select to_char(sysdate + 1/24, 'YYYYMMDD.FMHH24') from dual
TO_CHAR(SYSDATE+1/24,'ГГГГММДД.FMHH24') 20240622.0
select to_char(sysdate + 6/24, 'YYYYMMDD.FMHH24') from dual
TO_CHAR(SYSDATE+6/24,'ГГГГММДД.FMHH24') 20240622.5

рабочий пример

Затем вы можете использовать это по своему усмотрению:

...
where foo_number like to_char(sysdate, 'YYYYMMDD.FMHH24') || '^%'

Или, что еще проще, встраивание фиксированных символов в формат, чтобы вам не приходилось объединять их:

...
where foo_number like to_char(sysdate, 'YYYYMMDD.FMHH24"^%"')

рабочий пример

Спасибо; это отлично работает для моего приложения!

user25670446 22.06.2024 19:35

Другие вопросы по теме