Получение другого года при преобразовании столбца метки времени в char с использованием TO_CHAR - PullRequest
0 голосов
/ 25 апреля 2020

Это из Oracle 12 C и я даже попробовал из онлайн Oracle компилятор

Может кто-нибудь объяснить, почему это происходит вот так Вот простые шаги, которые я выполняю

- Создан GTT. Получение проблемы с физической таблицей

создание глобальной временной таблицы GTT_A (b timestamp (3));

- вставка даты с годом 1901

вставка в значения GTT_A ('01 -JAN-1901 ');

- При поиске прямой столбец дает год как 19, а при преобразовании в символ - 2019. Есть ли какое-то объяснение этому

Выберите b, to_char (b, 'mm-dd-yyyy') из GTT_A;

enter image description here

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

'01-JAN-1901' не является отметкой времени, это строка.

Не вставляйте строку; используйте литерал даты (он будет приведен к метке времени):

Insert into GTT_A values (DATE '1901-01-01');

или литерал метки времени, если вы хотите включить компонент времени:

Insert into GTT_A values (TIMESTAMP '1901-01-01 00:00:00');

Или, если вы хотите используйте строку, затем используйте TO_DATE с моделью формата для явного преобразования строки в дату:

Insert into GTT_A values (
  TO_DATE(
    '01-JAN-1901',
    'DD-MON-YYYY',
    'NLS_DATE_LANGUAGE=AMERICAN'
  )
);

или TO_TIMESTAMP:

Insert into GTT_A values (
  TO_TIMESTAMP(
    '01-JAN-1901',
    'DD-MON-YYYY',
    'NLS_DATE_LANGUAGE=AMERICAN'
  )
);

Если вы полагаетесь на неявный Затем Oracle попытается неявно преобразовать вашу строку в дату, а ваш запрос:

Insert into GTT_A values ('01-JAN-1901');

будет эффективно преобразован в:

Insert into GTT_A values (
  TO_TIMESTAMP(
    '01-JAN-1901',
    ( SELECT value
      FROM   NLS_SESSION_PARAMETERS
      WHERE  parameter = 'NLS_TIMESTAMP_FORMAT' )
  )
);

Каждый пользователь может установить свои собственные параметры сеанса. в ЛЮБОЕ раз, чтобы ваш запрос мог работать одну минуту, а затем пользователь обновляет свои параметры сеанса, и ваш запрос перестает работать без изменения вашего запроса. Не полагайтесь на неявные преобразования; сделайте так, чтобы вам ничего не нужно было конвертировать с использованием литерала даты / времени или использования явного преобразования.

1 голос
/ 25 апреля 2020

проверьте NLS_TIMESTAMP_FORMAT, используя

SELECT
  value
FROM
  V$NLS_PARAMETERS
WHERE
  parameter = 'NLS_TIMESTAMP_FORMAT';

и измените год на четыре цифры, используя приведенную ниже команду перед вставкой, например

     alter session set nls_timestamp_format='DD-MON-YYYY HH.MI.SSXFF AM'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...