关于To_Date函数的问题

时间:2015-03-03 16:39:36

标签: sql oracle date

我有两个问题,

1。 使用To_date函数时,为什么我无法获得 HH24:MI:SS

select To_date(fn_adjusted_date(SUBMIT_DATE),'DD-MON-YY-HH24:MI:SS')
from HPD_Help_Desk;

16-NOV-08

select To_char(fn_adjusted_date(submit_date),'DD-MON-YY-HH24:MI:SS')
from HPD_Help_Desk;

16-NOV-08-06:01:10

2。 使用时为什么会出现错误:

To_date(fn_adjusted_date(SUBMIT_DATE),'DD-MON-YY-HH24:MI:SS')

但是当我将其更改为:

时,更改它可以正常工作
To_date(fn_adjusted_date(SUBMIT_DATE),'DD-MM-YY-HH24:MI:SS')

演示:

select sysdate from dual;

03-MAR-15

alter session set nls_date_format = 'dd-mm-yyyy hh24:mi:ss';

select sysdate from dual;

03-03-2015 11:29:22

select To_date(fn_adjusted_date(SUBMIT_DATE),'DD-MON-YY-HH24:MI:SS')
from HPD_Help_Desk;

ORA-01843: not a valid month 01843. 00000 -  "not a valid month"

select To_char(fn_adjusted_date(submit_date),'DD-MON-YY-HH24:MI:SS')
from HPD_Help_Desk;

16-NOV-08-06:01:10

1 个答案:

答案 0 :(得分:0)

1。 因为to_date()为您提供了一个日期对象,并且您将其留给您的客户决定如何将其显示为字符串;它可能正在使用您的NLS_DATE_FORMAT设置。

由于您的fn_adjusted_date()函数返回的日期不是字符串,,然后就此调用to_date();您是否正在使用NLS_DATE_FORMAT进行隐式转换为字符串然后返回日期,以及第一个查询的显示方式 - DD-MON-YY? - 无论如何,这正在失去时间部分。所以你真的在做:

select to_date(to_char(fn_adjusted_date(SUBMIT_DATE), 'DD-MON-YY'),
  'DD-MON-YY-HH24:MI:SS') from HPD_Help_Desk;

2。 因为MON是日期语言中缩写的月份名称。这是从第一点开始的;现在,在您使用新的NLS_DATE_FORMAT进行价值的隐式to_char()的第一个中,它使用MM指定月份编号,但之后您尝试将其转换回日期与MON。所以这次你真的在做:

select to_date(to_char(fn_adjusted_date(SUBMIT_DATE), 'dd-mm-yyyy hh24:mi:ss'),
  'DD-MON-YY-HH24:MI:SS') from HPD_Help_Desk;

并且11不是有效的月份名称。 Oracle可以很灵活地使用日期格式;它可以使用'NOV'模型来解释MM,即使它没有意义,因为它不是一个数字,但意义非常明显;来自评论中的示例:

select to_date('16-Nov-2008', 'DD-MM-YY') from dual;

TO_DATE('16-NOV-2008','DD-MM-YY')
---------------------------------
16-NOV-2008 00:00:00              
但是,它并没有以另一种方式工作;它无法使用11解释MON。这种灵活性似乎不一致,有时似乎过于宽容。

在第二个查询中,您正在使用指定的格式模型执行显式to_char(),这是将日期显示为字符串的正确方法。

两者的基础消息相同:当您已有日期对象时,请不要致电to_date(),不要依赖隐式转换,也不要转换为只有当您希望将字符串作为最终结果集中特定格式的字符串时,才能将日期设置为字符串。