Как я могу сделать запрос, который возвращает «01-ЯНВ-1900» - PullRequest
0 голосов
/ 18 января 2019

Мы используем Oracle 11. Оба приведенных ниже запроса возвращают 01-JAN-00

  SELECT to_date('01-JAN-1900','dd-MM-yyyy') FROM DUAL
  SELECT to_date('01-JAN-1900','dd-MM-RRRR') FROM DUAL

Как мне сделать запрос, который возвращает '01 -JAN-1900'?

Мне нужно выполнить следующий запрос (myDtColumn является столбцом даты), если я просто использую '01 -JAN-1900 'без to_date, я получу ошибку' несовместимые типы данных: ожидается% s получил% s '

case when myDtColumn is null then to_date('01-JAN-1900','dd-MM-yyyy') else 
myDtColumn  end as myDt

Когда я пробую нижеприведенное, я все еще получаю '01 -JAN-00 'вместо '01 -JAN-1900'

case when myDtColumn is null then DATE '1900-01-01' else 
myDtColumn  end as myDt

1 Ответ

0 голосов
/ 18 января 2019

Даты не имеют формата - они представлены внутри 7 или 8 байтами . Если вы хотите, чтобы дата имела формат, вам необходимо преобразовать ее в тип данных, который может быть отформатирован (то есть строка). Когда пользовательский интерфейс, который вы используете, должен отображать дату, он неявно преобразует ее в строку, а Oracle использует параметр сеанса NLS_DATE_FORMAT в качестве формата по умолчанию.

Вы можете изменить это, используя:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

Тогда либо ваш запрос, либо, используя литерал даты:

SELECT DATE '1900-01-01' FROM DUAL

Будет неявно отформатирован с использованием NLS_DATE_FORMAT, когда пользовательский интерфейс отображает их.

Или по вашему запросу:

SELECT COALESCE( myDtColumn, DATE '1900-01-01' ) as myDt
FROM   your_table;

Если вы не хотите изменять параметры сеанса, используйте TO_CHAR( date_value, 'DD-MON-YYYY' ):

SELECT TO_CHAR( COALESCE( myDtColumn, DATE '1900-01-01' ), 'DD-MON-YYYY' ) as myDt
FROM   your_table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...