Как запросить столбцы временных меток с помощью T и Z в Oracle 11?

#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')