Преобразование метки времени в дату в Oracle 12c - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу преобразовать данную метку времени в таком формате: 2019-04-08 00:00:00.0 в дату в этом формате: 2019-04-08.

Я уже пробовал использовать:

SELECT TO_DATE('2019-04-20 00:00:00.0','YYYY-MM-DD') from dual; 

НоЯ получил сообщение с:

ORA-01830: изображение в формате даты заканчивается перед преобразованием всей входной строки

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Может ли CAST принести пользу?

Я настраиваю формат даты так, чтобы он отображал время компонент, хотя это 00: 00:

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select cast(timestamp '2019-04-20 00:00:00.0' as date) result from dual;

RESULT
-------------------
20.04.2019 00:00:00

Другой формат (без компонента времени):

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> select cast(timestamp '2019-04-20 00:00:00.0' as date) result from dual;

RESULT
----------
20.04.2019

SQL>

Или с использованием функции TO_CHAR (чтобы формат даты сеанса не имел значения):

SQL> select to_char(timestamp '2019-04-20 00:00:00.0', 'dd.mm.yyyy') result from dual;

RESULT
----------
20.04.2019

SQL>
0 голосов
/ 20 декабря 2018

Я думаю, что вы можете иметь некоторое концептуальное недопонимание о том, как работает функция TO_DATE, а также о том, как даты обрабатываются СУБД.

YYY-MM-DD не соответствует формату фактической строки, которую вы используетеimporting (2019-04-20 00:00:00.0) Вот что говорит вам ошибка.Вы должны сообщить функции TO_DATE, что ожидать в строке даты, которую вы вводите в нее .Вы делаете это с помощью строки формата.если вы не укажете строку формата, которая соответствует формату, который вы на самом деле собираетесь предоставить, то функция не сможет обработать строку.

Далее вы говорите, что хотите преобразовать ее "в датув этом формате "... но это не совсем имеет смысл.TO_DATE преобразует строку в переменную типа DATETIME - т.е. объект даты.Объект даты не существует ни в каком конкретном формате, он существует как объект.Внутренне он будет хранить информацию о дате способом, который не зависит от любого читаемого человеком формата даты.Формат полностью относится к представлению даты, когда оно рассматривается как строка .Если у вас есть объект даты, вы можете вывести дату в определенном формате, если вы хотите, чтобы человек мог читать ее в стиле, с которым знакома его культура.

Итак, во-первых, чтобы правильно импортировать вашу строку даты как объект даты, вы можете использовать точную строку формата, а также использовать TO_TIMESTAMP вместо TO_DATE, чтобы она захватила значение в секундах:

SELECT TO_TIMESTAMP('2019-04-20 00:00:00.0','YYYY-MM-DD HH24:MI:SS.FF5') from dual; 

Есливы запускаете это в консоли, затем SELECT автоматически переформатирует этот объект даты (результат функции TO_DATE) в формат даты по умолчанию, настроенный на вашем сервере / сеансе.

Однако, если вы действительно хотите увидетьэто на экране в определенном формате, вы можете прямо сказать - разумным способом является использование функции TO_CHAR:

SELECT TO_CHAR(TO_TIMESTAMPT('2019-04-20 00:00:00.0','YYYY-MM-DD HH24:MI:SS.FF5'), 'YYYY-MM-DD') from dual;

Полный список спецификаторов формата можно найти здесь (ии в других местах онлайн).

Демонстрация вышеперечисленного здесь: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=619d918ea73953e11b3150c6b560112c

0 голосов
/ 20 декабря 2018

Предполагая, что ввод - это фактический текст, а не реальная временная метка, вы можете попробовать просто обрезать текст перед вызовом TO_DATE:

WITH cte AS (
    SELECT '2019-04-20 00:00:00.0' AS ts FROM dual
)

SELECT TO_DATE(SUBSTR(ts, 1, 10), 'YYYY-MM-DD')
FROM cte;

Если ваш ввод является фактической временной меткой Oracle, и выхотите конвертировать его в дату, тогда вы можете использовать CAST:

SELECT CAST(ts AS DATE) dt
FROM cte;
...