Получить дату в oracle из метки времени без завершающих o? - PullRequest
1 голос
/ 26 мая 2020

Я просматривал стек и Google, чтобы найти способ извлечь дату из отметки времени без конечного нуля, который все еще является датой, а НЕ переменной VARCHAR -

например:

SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL

дает: 18-JUL-12 00:00:00

Я хочу, чтобы это было в формате даты '18/07/2012' в конце.

TIA заранее, если это возможно.

Ответы [ 3 ]

0 голосов
/ 26 мая 2020

Типы данных DATE и TIMESTAMP - это oracle внутренний двоичный тип. ПО ОПРЕДЕЛЕНИЮ они содержат компонент времени - DATE с точностью до секунд, TIMESTAMP с точностью до наносекунды. И наоборот, поскольку это внутренние двоичные структуры, то, что вы видите на экране, снова ПО ОПРЕДЕЛЕНИЮ , преобразовано в строку символов - VARCHAR2. Возможно, вы не указали TO_CHAR, но сам акт выбора DATE или TIMESTAMP для отображения (не используется внутри) принудительно oracle применить к нему TO_CHAR.

Поскольку эти типы данных по определению содержат компоненты времени, логически непоследовательно сказать, что вы хотите «извлечь дату из отметки времени без конечных нулей (компонент времени), которые все еще являются датой, а НЕ переменной VARCHAR -» .

0 голосов
/ 27 мая 2020

Я просматривал стек и 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 < > скрипка

0 голосов
/ 26 мая 2020

Ну вот что ты говоришь. В моей базе данных это приводит к

SQL> SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;

TRUNC(TO
--------
18.07.12

SQL>

Если вы хотите получить другой результат, измените сеанс:

SQL> alter session set nls_Date_format = 'dd/mm/yyyy';

Session altered.

SQL> SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;

TRUNC(TO_D
----------
18/07/2012

Или примените TO_CHAR с маской желаемого формата:

SQL> SELECT to_char(TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')), 'dd/mm/yyyy') FROM DUAL;

TO_CHAR(TR
----------
18/07/2012

Хотя я не вижу особого смысла в том, что вы делаете:

  • сначала вы конвертируете строку ('2012-07-18 13:27:18 ') до даты
  • затем вы обрезаете его временную часть
  • наконец, вы хотите получить только часть даты, но снова в виде строки

Итак, почему Разве вы просто не используете

SQL> select '18/07/2012' from dual;

'18/07/201
----------
18/07/2012

(конечно, если только эта строка даты на самом деле не происходит где-то из неправильной таблицы; никогда не сохраняйте даты в VARCHAR2 столбцах).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...