Oracle 日期格式 [重复]
Posted
技术标签:
【中文标题】Oracle 日期格式 [重复]【英文标题】:Oracle Date format [duplicate] 【发布时间】:2013-06-26 17:15:39 【问题描述】:Oracle 11g 文档说默认日期格式是 DD-MON-YYYY,这意味着如果我使用以下方法将日期插入日期列:
insert into table t values(1, '02-JAN-2013')
然后选择它
select * from t
它应该显示为 02-JAN-2013,而实际上它显示的日期为 01/02/2013。
为什么他的差异或我错过了什么。
参考。 http://infolab.stanford.edu/~ullman/fcdb/oracle/or-time.html
仅供参考。我正在使用 PL/SQL Developer 进行此实验。
【问题讨论】:
【参考方案1】:产品并没有真正的默认日期格式,reference guide 指出系统级别的NLS_DATE_FORMAT
默认是基于NLS_TERRITORY
。虽然this 说“标准”是“DD-MON-RR”,但我认为如果你不指定数据库级别的值,至少在我工作过的平台上,这就是你得到的。
当您创建一个新数据库时,初始化参数可以包含一个特定的NLS_DATE_FORMAT
,以后也可以更改。
但系统级别的NLS_DATE_FORMAT
可以被客户端、会话或TO_CHAR
调用覆盖。您可以查看v$nls_parameters
以查看系统值,并查看nls_session_parameters
以查看您当前的会话值。如果您愿意,可以使用 alter session
更改它。
我很确定您会发现 PL/SQL Developer 在其首选项中的某处将会话 NLS_DATE_FORMAT
设置为 MM/DD/YYYY
。
通常最好不要依赖该值,并始终使用显式格式掩码进行显示,例如TO_CHAR(<column>, 'YYYY-MM-DD HH24:MI:SS')
.
在全球化指南here 和here 中有更多关于NLS_DATE_FORMAT
的内容;还有一点关于日期显示here;以及日期格式模型元素概览here
【讨论】:
如果是这种情况,那么为什么我必须在比较日期时使用特定格式:例如。从 search_instance si 中选择 si.effective_date ,其中 si.effective_date > '26-JUN-2013' order by si.effective_date 。如果我使用 '06/26/2013' 而不是 '26-JUN-2013' ,它会说 'Not a valid Month'。 要回答您的评论,请阅读我的回答 here 或 here(我相信 Alex 也有很多)@user204069... 你是 不是 i> 在那里比较日期,您正在比较字符串。 总是将字符串显式转换为日期以进行日期比较。 @user204069 - 你的会话价值是多少?您正在执行从字符串到日期的隐式转换,您应该避免这种转换,因为它是模棱两可的。你应该使用to_date('06/26/2013', 'MM/DD/YYYY')
。或者可能是 date '2013-06-26'
,使用 ANSI 日期文字。【参考方案2】:
取决于NSL_DATE_FORMAT
取决于NLS_TERRITORY
看看:http://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams122.htm
【讨论】:
如果是这种情况,那么为什么我在比较日期时必须使用特定格式:例如。从 search_instance si 中选择 si.effective_date ,其中 si.effective_date > '26-JUN-2013' order by si.effective_date 。如果我使用 '06/26/2013' 而不是 '26-JUN-2013' ,它会说 'Not a valid Month'。 我尝试始终使用 ansi 日期格式:'YYMMDDHHMISS',我不必检查数据库使用的格式。然后我可以使用si.effective_date > '20130626000000'
以上是关于Oracle 日期格式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章