Я просматривал стек и Google, чтобы найти способ извлечь дату из отметки времени без конечного нуля, который все еще является датой, а НЕ VARCHAR
переменной
Вы невозможно, если вы хотите, чтобы значение по-прежнему было DATE
A DATE
хранится внутри как 7-байтов и всегда имеет год (2 байта), месяц, день, час , компоненты минуты и секунды (по 1 байту каждый).
A TIMESTAMP
хранится внутри с 11-20 байтами с теми же компонентами, что и DATE
, но также с компонентами дробных секунд и необязательными компоненты часового пояса.
Ни DATE
, ни TIMESTAMP
не имеют формата, потому что это просто двоичные данные, и вы не можете удалить компонент времени, потому что оба они всегда имеют компонент времени.
SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL
дает: 18-JUL-12 00:00:00
Запрос выводит DATE
, и в зависимости от используемого пользовательского интерфейса дата может быть неявно преобразована в строку для вывода. SQL / Plus и SQL Developer используют параметр сеанса NLS_DATE_FORMAT
для неявного преобразования DATE
s в строки при отображении их пользователю:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;
Вывод: 2012-07-18 13:27:18
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;
Выводы: 2012-07-18
Однако, ЛЮБОЙ пользователь может изменять свои собственные параметры сеанса в ЛЮБОЕ время, поэтому вам никогда не следует полагаться на неявное форматирование дат.
Если вам нужен DATE
, не следует ожидать, что он будет отформатирован каким-либо определенным образом, поскольку это просто двоичные данные. Если вам нужна отформатированная дата, вы должны явно преобразовать ее в строку с требуемым форматированием, используя TO_CHAR
:
SELECT TO_CHAR(
TRUNC( to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS') ),
'DD/MM/YYYY'
)
FROM DUAL;
Выводы: 18/07/2012
db < > скрипка