#sql #oracle #oracle11g #timestamp
Вопрос:
Если я выполню следующий запрос,
select dt from table where dt <= timestamp '2021-06-01T10:45:00Z'
Я понимаю ORA-01861: literal does not match format string error
. Однако, если я удалю T и Z из строки, это будет работать нормально.
Итак, мой вопрос в том, как я могу запросить метку времени с помощью T и Z здесь. Мне нужно уметь это делать, потому что метка времени возвращается инструментом в этом формате (поэтому я сам не могу удалить T и Z), а другой инструмент напрямую использует ее в запросе. Однако я могу сам изменить запрос. Метка времени там называется переменной.
Ответ №1:
Если ваш dt
столбец представляет собой метку времени без часового пояса или даты, и вы игнорируете часовой пояс из фиксированной строки, вы можете сделать:
where dt <= to_timestamp('2021-06-01T10:45:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z")
или
where dt <= to_date('2021-06-01T10:45:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z")
Если вы хотите соблюдать часовой пояс, потому что, например dt
, это отметка времени с часовым поясом, вы можете объявить значение как UTC:
where dt <= from_tz(to_timestamp('2021-06-01T10:45:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"), 'UTC')
Однако будьте осторожны с типом данных столбца таблицы.
И если через несколько секунд появятся числа, такие как 10:38:10.11956, каков будет формат?
Добавляйте .FF
в течение доли секунды:
to_timestamp('2021-06-01T10:38:10.11956Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF"Z")
Не то чтобы это не сработало to_date()
, так как у этого нет точности в доли секунды. При необходимости вы можете привести метку времени к дате или округлить/обрезать, чтобы сделать это неявно.
Элементы модели формата находятся в документации; в ней также показаны символьные литералы, такие как T и Z в этом формате.
Комментарии:
1. И если через несколько секунд появятся числа, такие как 10:38:10.11956, каков будет формат?
2. @MetallicPriest — используйте
FF
в течение доли секунды.
Ответ №2:
Метод грубой силы будет использовать to_timestamp_tz()
и для замены часового пояса с часовым смещением:
to_timestamp_tz(replace('2021-06-01T10:45:00Z', 'Z', ' 00'), 'YYYY-MM-DD"T"HH:MI:SS TZH')