Функция DECODE в ORACLE не выдает дату 01-01-1900 в качестве вывода - PullRequest
0 голосов
/ 26 мая 2020

В oracle в нашем проекте, где функция DECODE является рекомендуемым руководством для их использования, возникают проблемы при преобразовании даты 01-01-1900. Рассмотрим приведенный ниже код декодирования

CAST(DECODE(COL1,'A',DATECOL,TO_DATE('01011900','DDMMYYYY')) AS DATE) - (The CAST is also a mandatory guideline)

If,
COL1 DATECOL
A    2019-04-05
B    2018-01-01
C    2020-05-01

Я получаю результирующие данные как

COL1 OUTPUT
A    2019-04-05
B    2000-01-01
C    2000-01-01

Функция DECODE дает мне 2000-01-01 вместо 1900-01-01. Я проверил параметры NLS и балуюсь, изменяя разные вещи в функции TO_DATE. Ничего не вышло.

1 Ответ

1 голос
/ 27 мая 2020

Возможно ли, что ваш DATECOL в базе данных действительно является строкой? Потому что, если это так, DECODE всегда берет первый потенциальный возвращаемый элемент для установки типа данных. И как только вы начнете смешивать и сопоставлять типы данных, могут случиться плохие вещи.

Например,

SQL> alter session set nls_date_format = 'YY-MM-DD';

Session altered.

SQL> with t as
  2  ( select 'A' col1, '2010-01-01' datecol from dual union all
  3    select 'B' col1, '2010-01-01' datecol from dual )
  4  select  CAST(DECODE(COL1,'A',DATECOL,TO_DATE('01011900','DDMMYYYY')) AS DATE)
  5  from t;

CAST(DEC
--------
10-01-01
00-01-01

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

SQL> with t as
  2  ( select 'A' col1, '2010-01-01' datecol from dual union all
  3    select 'B' col1, '2010-01-01' datecol from dual )
  4  select  to_char(CAST(DECODE(COL1,'A',DATECOL,TO_DATE('01011900','DDMMYYYY')) AS DATE),'dd-mm-yyyy')
  5  from t;

TO_CHAR(CA
----------
01-01-2010
01-01-2000

, вы можете видеть, что отсутствие спецификации полного столетия "исказило" результат. В частности, инструменты, которые вы используете (SQL Developer и другие), будут иметь свое собственное форматирование результатов, которое может маскировать то, что может происходить с типами данных.

...