在Oracle中将日期格式从'yyyy/mm/dd'更改为'mm-dd-yyyy'。
在Oracle中将日期格式从'yyyy/mm/dd'更改为'mm-dd-yyyy'。
我在Oracle中的表中插入了数据。如果不使用PLSQL,我的实现代码如下:
SELECT to_date('1900-01-01','YYYY-MM-DD') + (rownum - 1) AS DT_CAL, rownum AS NUM_JOUR FROM dual CONNECT BY to_date('1900-01-01','YYYY-MM-DD') + (rownum - 1) <= to_date('2000-12-31','YYYY-MM-DD')
结果是:05/28/1900
,而不是 1900-05-28
。你能帮助我理解问题出在哪里吗?
在Oracle中将日期格式从'yyyy/mm/dd'更改为'mm-dd-yyyy'的问题,出现的原因是to_date()函数将字符串参数与第二个参数中提供的格式匹配,并从中构建一个日期字段。实际上,日期字段不会使用第二个参数中提供的格式存储,而是使用一种没有格式的内部数据表示(很可能是一个数字)。
要从日期字段中以所需的格式呈现格式,请使用以下方法之一:
1. 让执行查询的客户端设置NLS参数(在会话级别),以提供本地化格式。使用ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';
语句来设置参数。
2. 在现有字段周围使用to_char(..., 'YYYY-MM-DD')
,将日期转换为所需格式的字符串。其中,将...
替换为在select语句中的当前列定义。
方法1已经在发生,因为已经设置了一个产生当前格式的NLS_DATE_FORMAT,但是这是一个你不想要的格式,所以如果你可以控制并在那里更改它,你可以使用这种方法。如果你不能控制并且必须使用一个单一的一致格式,那么方法2可能是解决问题的方法。
这是正确的答案。对于“生产”查询,最好始终使用to_char(DATE_COLUMN, '.....')和所需的日期格式模型,因为我们无法控制另一个用户的NLS设置;但对于OP只是为了检查自己的结果,NLS_DATE_FORMAT解决方案已经足够。关于Oracle在内部存储日期时使用的内部格式的注意事项:"BluShadow"在OTN上有一个很好的解释。你可以运行SELECT DUMP(SYSDATE) FROM DUAL来自己查看。它不明显,但它不是一个数字,它是七个数字。
日期的格式也可以在Stackoverflow文档中找到。
非常好,谢谢!我看到了SO文档的广告,但还没有去看。这是个很好的主意,可能很快就会加入这个工作。
问题的原因是Oracle的DATE数据类型没有固定的格式,它以7或8个字节的形式存储,直到传递给客户端程序(如SQL/Plus、SQL Developer、Toad、Java、Python等),客户端程序根据其规则格式化日期。
如果使用SQL/Plus或SQL Developer,它会使用NLS_DATE_FORMAT会话参数来格式化日期。可以使用ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'来更改这个参数。需要注意的是,这只会在当前会话中更改格式,不会影响其他会话和用户。
如果想要给日期指定特定的格式,需要将其转换为字符串。当使用to_char('2006-01-01','YYYY-MM-DD')时,会出现ORA-00932错误,提示不一致的数据类型,期望的是DATE类型,而实际得到的是NUMBER类型。原因是'2006-01-01'是一个字符串字面量,不是一个日期字面量。
解决方法是将'2006-01-01'转换为日期字面量,即使用DATE '2006-01-01'。
这种方法对我有效。