2013-06-20 79 views
5

我的访问表如下:Oracle。如何输出日期和时间?

insert into Visit 
values(12, to_date('19-JUN-13', 'dd-mon-yy'), to_date('19-JUN-13 12:00 A.M.' , 'dd-mon-yy hh:mi A.M.')); 
insert into Visit 
values(15, to_date('20-JUN-13', 'dd-mon-yy'), to_date('20-JUN-13 02:00 A.M.' , 'dd-mon-yy hh:mi A.M.')); 
insert into Visit 
values(18, to_date('21-JUN-13', 'dd-mon-yy'), to_date('21-JUN-13 10:30 A.M.' , 'dd-mon-yy hh:mi A.M.')); 

当我尝试进行查询: select * from Visit我得到:

SQL> select * from visit; 

    SLOTNUM DATEVISIT ACTUALARRIVALTIME                                                                                             
---------- --------- ------------------------------                                                                                          
     12 19-JUN-13 19-JUN-13                                                                                                                      
     15 20-JUN-13 20-JUN-13                                                  
     18 21-JUN-13 21-JUN-13                                                  

SQL> spool off; 

怎么来的时候是不是有?

回答

5

您还可以设置适用于所有日期这样的格式:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH:MI:SS PM'; 

这样一来,原来的查询将输出您使用格式的日期,而不使用TO_CHAR。要恢复到通常的默认格式,只需执行以下操作:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR'; 
+1

是否应该是HH:MI:SS而不是HH:M:SS? –

+0

正确@MaximEliseev,谢谢你让我知道!这是一个错字。我已经用您的修复程序更新了答案。 –

8

这是oracle日期格式,它被设置为您的实例的默认格式。

必须先指定格式看到更多或更少的..这样的事情:

select to_char(datevisit, 'dd-mon-yy hh24:mi:ss') from visit 
+0

谢谢,那么我不能使用'select *',我可以...吗?我必须列出所有列:'从访问中选择col1,col2,to_char(...)?是对的吗? – Buras

+0

@ Buras - 如Ed Gibbs所示,如果您发出'alter session',则可以使用'select *'。 –

2

你依赖隐日期转换,这是使用(会话相关的,但也许从继承数据库默认)NLS_DATE_FORMAT设置 - 在这种情况下,似乎是DD-MON-RR

您可以使用to_char指定格式,例如:

select to_char(actualarrivaltime, 'DD-MON-YYYY HH:M:SS PM') from .. 

datetime format models are described in the documentation

总的来说,最好不要依赖implcit转换。即使你现在得到了你期望的结果,它们也可以是会话特定的,所以另一个客户端中的另一个用户可以看到不同的东西。这可能会导致失败以及看起来错误。始终指定日期和数字格式,使用to_dateto_charto_timestamp

2

Oracle内部遵循'DD-Mon-YY'格式存储在数据库中。所以它返回'DD-Mon-Y

如果你想以小时和分秒的日期格式。您可以在会话中更改NLS_DATE_FORMAT。

如果您想要查询该实例的正好显示目的。使用TO_char函数将其转换为所需的格式。

SELECT slotnum, TO_CHAR (datevisit, 'DD-MON-YY ') "DATEVISIT", 
     TO_CHAR (actualarrivaltime, 'DD-MON-YY HH:MI:SS AM') "ACTUALARRIVALTIME" 
    FROM visit 

我希望上面的查询给你输出,只要你喜欢。

+0

日期不会*以DD-Mon-YY或任何其他人可读格式存储。 Oracle使用自己的[7字节内部表示](http://stackoverflow.com/a/187492/266304)来存储日期。 –