如何进行返回'01 -JAN-1900'的查询

fau*_*ong -2 sql oracle date oracle11g

我们正在使用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
Run Code Online (Sandbox Code Playgroud)

如何进行返回'01 -JAN-1900'的查询?

我需要做下面的查询(myDtColumn是一个Date列),如果我只使用不带to_date的'01 -JAN-1900',我会得到错误'不一致的数据类型:期望%s得到%s'

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

当我尝试以下时,我仍然得到'01 -JAN-00'而不是'01 -JAN-1900'

case when myDtColumn is null then DATE '1900-01-01' else 
myDtColumn  end as myDt
Run Code Online (Sandbox Code Playgroud)

MT0*_*MT0 5

日期没有格式 - 它们在内部由7或8个字节表示.如果您希望日期具有格式,则需要将其转换为可以格式化的数据类型(即字符串).当您使用的用户界面需要显示日期时,它将隐式将其转换为字符串,Oracle使用NLS_DATE_FORMAT会话参数作为其默认格式.

你可以改变这个:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';
Run Code Online (Sandbox Code Playgroud)

那么你的任何一个查询,或使用日期文字:

SELECT DATE '1900-01-01' FROM DUAL
Run Code Online (Sandbox Code Playgroud)

将使用NLS_DATE_FORMATUI显示它们时隐式格式化.

或者您的查询:

SELECT COALESCE( myDtColumn, DATE '1900-01-01' ) as myDt
FROM   your_table;
Run Code Online (Sandbox Code Playgroud)

如果您不想更改会话参数,请使用TO_CHAR( date_value, 'DD-MON-YYYY' ):

SELECT TO_CHAR( COALESCE( myDtColumn, DATE '1900-01-01' ), 'DD-MON-YYYY' ) as myDt
FROM   your_table;
Run Code Online (Sandbox Code Playgroud)