关于to_datet的使用我如果不指定格式的话,它的默认格式是什么呢?用我如果不指定格式的话,它的默认格式是什么呢?

koooky 2011-05-03 10:44:40
现象:C#.net开发的程序,在2个环境中连接同一个Oracle数据库,使用 to_date(日期字符串)
其中在开发环境中,没有出现任何问题。
在测试环境中,就会报ORA-01861的错误

调查:经过一定调查,我知道应该是 to_date的使用没有指定格式的原因,如 to_date(日期,格式)

提问:我想问的是,为什么在2个不同环境中会出现不同的结果。
其中一个是没问题,另一个会出现错误呢?
是因为客户端需要什么设置吗?客户端有默认的日期格式吗?
...全文
238 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yejihui9527 2011-05-03
  • 打赏
  • 举报
回复
10G 报错的哦。
yejihui9527 2011-05-03
  • 打赏
  • 举报
回复
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as gxsi


SQL> select to_date('2011-01-01') from dual;

select to_date('2011-01-01') from dual

ORA-01861: literal does not match format string

SQL>
304的的哥 2011-05-03
  • 打赏
  • 举报
回复

--ORA-01861 文字与格式字符串不匹配
--最好是手动设置日期格式,避免使用默认格式带来的问题!
SQL> select * from v$nls_parameters;

PARAMETER VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY ¥
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
NLS_CHARACTERSET ZHS16GBK
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY ¥
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
tangren 2011-05-03
  • 打赏
  • 举报
回复
查看一下:
select * from v$nls_parameters;

不要依赖默认的日期格式,手动指定格式符,如
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
ssqtjffcu 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 koooky 的回复:]
谢谢各位的热心解答!

如各位提到的,最好的解决办法是 to_date(日期,格式) ,就不会没有问题了!
但是具体在多语言环境下同一个服务器,使用Oracle的函数to_date为什么会不一样的结果的真正原因到底是什么呢?

经过网上调查了一下,大致如下,跟大家共享一下。
【原因】

 在不指定转换字符串的情况下,Oracle客户端使用本地既定的格式串进行日期转换操作。
 ※执……
[/Quote]
一般使用to_date()都用加个转换的格式的拉,这样才能统一,不受外在环境影响!!
koooky 2011-05-03
  • 打赏
  • 举报
回复
谢谢各位的热心解答!

如各位提到的,最好的解决办法是 to_date(日期,格式) ,就不会没有问题了!
但是具体在多语言环境下同一个服务器,使用Oracle的函数to_date为什么会不一样的结果的真正原因到底是什么呢?

经过网上调查了一下,大致如下,跟大家共享一下。
【原因】

 在不指定转换字符串的情况下,Oracle客户端使用本地既定的格式串进行日期转换操作。
 ※执行SELECT * FROM NLS_SESSION_PARAMETERS查看本地格式
  执行SELECT * FROM NLS_DATABASE_PARAMETERS查看服务器格式

【解决办法】

 方法1:更改注册表\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG会使NLS_DATE_FORMAT同步为相应的格式。
     假设我们这里需要japanese格式。我通过增加环境变量(NLS_LANG=JAPANESE_JAPAN.JA16SJIS)实现。

 方法2:在注册表\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0增加变量NLS_DATE_FORMAT(RR-MM-DD或yy-mm-dd或yy/mm/dd任何你需要的格式)。

 方法3:使用函数时加上格式 to_date(日期,格式)
     无论NLS_DATE_FORMAT是什么,select to_date('2010/11/15','yy/mm/dd') from dual--ok。

     但是还是不要高兴过早了,select to_date('2010/nov/15','yy/mon/dd') from dual--不一定ok。
     当NLS_LANGUAGE环境为AMERICAN时是OK的,为East Asia language时mon格式符真正识别的是11月
    (这里japan和china还是不一样的,看起来是一个字,但是从我机器输入select to_date(
     '2010/11月/15','yy/mon/dd') from dual却出错。

 总结:最推荐第3种方法。
    作为一个程序开发员,我们需要书写出良好的可读性代码,这样才能告诉对方这个日期的格式是什么。

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧