2011-11-04 96 views
1

必须有一个非常简单的答案,但我无法在任何地方找到它。Oracle to_date()不正确的输出

我这是我的select声明节:根据所有文档的

 case when q.renewal_date is not null then 
      to_date(q._renewal_date, 'DD/MM/YYYY') 
     else 
      to_date(w.END_DATE, 'DD/MM/YYYY') 
     end END_DATE, 

我可以找到MM应该给在数不过我得到的结果如月份:

30-SEP-12 
26-JUN-11 
30-SEP-12 

这也是有趣的,他们是连字符( - )而不是斜杠(/)。

那么,这是什么原因,我如何实现我想要的?

回答

6

假设w.end_Dateq._renewal_date是实际日期,要to_char他们,而不是to_date。目前我会说你会看到你的NLS设置指定格式的日期。 (如果它们不是日期,则将它们转换为日期,但仍然允许NLS设置选择查看它的格式)

1

由于您是TO_DATE它在Oracle内部作为日期存储的值。它将使用您设置的NLS_DATE设置值显示给您,默认情况下我会假设它设置为DD-MON-YY

您可以检查与

SELECT * 
    FROM v$parameter 
WHERE name = 'nls_date_format'; 

你要么需要改变你的NLS_DATE_FORMAT设置(无论是你的会话或为DB)或TO_CHAR输出到你想看到的格式。

0

to_date将字符串转换为日期。您所拥有的代码将采用'DD/MM/YYYY'格式的字符串(q._renewal_date)并将其转换为日期。你所看到的是日期字段的默认呈现。

取决于q._renewal_date的类型,您可能需要使用不同的转换/格式化功能。