oracle中的date类型转换

quanjunchuji 2014-10-23 08:16:31
create table job_history (
employee_id number(6) not null,
start_date date not null,
end_date date not null,
job_id varchar2(10) not null,
department_id number(4)
);

有一张job_history表,我往表中插入数据
INSERT INTO job_history VALUES(
102 , TO_DATE('13-JAN-93','DD-MON-YYY'), TO_DATE('24-JUL-98','DD-MON-YYY'), 'IT_PROG', 60 )

但是查询后的结果是


其中的日期和预期的'13-JAN-93'不符合,并且93也变成2093,

请问该怎么解决。。
...全文
643 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ning_wnn2014 2014-12-02
  • 打赏
  • 举报
回复
使用YY格式 如果日期中的年份采用的格式为YY,并且只提供了2位的年份,那么就认为这一年的世纪与数据库服务器上当前设置的世纪相同。因此,指定年份的前两位数字与当前年份的前两位数字相同。例如,如果提供的年份是15,而当年是2007年,那么提供的年份就是2015年。同理,如果提供的年份是75,那么就是2075年。 注意: 如果日期中的年份使用YYYY格式,但是只提供了2位的年份,那么Oracle数据库就会使用YY格式来解释日期。 下面来看一个查询,它在处理年份15和75时使用YY格式。在下面这个查询中,注意向TO_DATE()函数输入的年份是15和75,其输出又被传递给TO_CHAR函数,后者将日期转换为DD-MON-YYYY格式的字符串(此处使用了YYYY格式,这样就可以看到TO_DATE函数返回的4位年份)。 SELECTTO_CHAR(TO_DATE('04-JUL-15', 'DD-MON-YY'), 'DD-MON-YYYY'),TO_CHAR(TO_DATE('04-JUL-75', 'DD-MON-YY'), 'DD-MON-YYYY')FROM dual;TO_CHAR(TO_ TO_CHAR(TO_----------- -----------04-JUL-2015 04-JUL-2075 正如期望的一样,15和75分别被解释为2015年和2075年。 使用RR格式 如果日期中的年份采用的格式为RR,并且只提供了最后2位年份,那么年份中的前两位数字就由两部分共同确定:提供年份的两位数字(指定年),数据库服务器上当前日期中年份的后2位数字(当年)。确定指定年世纪的规则如下: ● 规则1 如果指定年在00~49之间,并且当前年份在00~49之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为15,而当前年份为2007,那么指定年就是2015。 ● 规则2 如果指定年在50~99之间,并且当前年份在00~49之间,那么指定年的世纪就等于当前年份的世纪减去1。因此,指定年的前两位数字等于当前年份的前两位数字减去1。例如,如果指定年为75,而当前年份为2007,那么指定年就是1975。 ● 规则3 如果指定年在00~49之间,并且当前年份在50~99之间,那么指定年的世纪就等于当前年份的世纪加上1。因此,指定年的前两位数字等于当前年份的前两位数字加上1。例如,如果指定年为15,而当前年份为2075,那么指定年就是2115。 ● 规则4 如果指定年在50~99之间,并且当前年份在50~99之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为55,而当前年份为2075,那么指定年就是2055。
ffshao 2014-11-07
  • 打赏
  • 举报
回复
如果格式为YY且只提供了最后2位年份,那么服务器会在前面自动添加当前年份的前两位; 如果格式为YYY且只提供了最后2位年份,那么服务器会同YY格式一样操作; 如果格式为YYYY且只提供了最后2位年份,那么服务器会在前面接00; 如果格式为RR或RRRR且只提供了最后2位年份,则确定世纪的规则如下: 确定指定年世纪的规则如下: ● 如果指定年在00~49之间,并且当前年份在00~49之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为15,而当前年份为2007,那么指定年就是2015。 ● 如果指定年在50~99之间,并且当前年份在00~49之间,那么指定年的世纪就等于当前年份的世纪减去1。因此,指定年的前两位数字等于当前年份的前两位数字减去1。例如,如果指定年为75,而当前年份为2007,那么指定年就是1975。 ● 如果指定年在00~49之间,并且当前年份在50~99之间,那么指定年的世纪就等于当前年份的世纪加上1。因此,指定年的前两位数字等于当前年份的前两位数字加上1。例如,如果指定年为15,而当前年份为2075,那么指定年就是2115。 ● 如果指定年在50~99之间,并且当前年份在50~99之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为55,而当前年份为2075,那么指定年就是2055。
bw555 2014-10-29
  • 打赏
  • 举报
回复
引用 5 楼 alicejohn 的回复:
我其实是怀疑楼主那个怎么插入的。。。。。。。。。为啥我就执行失败呢
应该是字符集问题,中文字符集的话 mon对应的是 xx月,英文字符集mon对应的是英文的前几个字符
alicejohn 2014-10-29
  • 打赏
  • 举报
回复
我其实是怀疑楼主那个怎么插入的。。。。。。。。。为啥我就执行失败呢
bw555 2014-10-29
  • 打赏
  • 举报
回复
引用 3 楼 wyuanlin 的回复:
试试这个 INSERT INTO job_history VALUES( 102 , TO_DATE('13-JAN-93','dd-mm-yyyy'), TO_DATE('24-JUL-98','dd-mm-yyyy'), 'IT_PROG', 60 )
自己先去测试下再来回复,唉!
SQL> select TO_DATE('13-JAN-93','dd-mm-yyyy'),TO_DATE('24-JUL-98','dd-mm-yyyy') from dual;
select TO_DATE('13-JAN-93','dd-mm-yyyy'),TO_DATE('24-JUL-98','dd-mm-yyyy') from dual
               *
第 1 行出现错误:
ORA-01858: 在要求输入数字处找到非数字字符
L-B-J 2014-10-29
  • 打赏
  • 举报
回复
试试这个 INSERT INTO job_history VALUES( 102 , TO_DATE('13-JAN-93','dd-mm-yyyy'), TO_DATE('24-JUL-98','dd-mm-yyyy'), 'IT_PROG', 60 )
wangwei 2014-10-23
  • 打赏
  • 举报
回复
查看你使用的是RR格式还是YY格式的 select * from nls_database_parameters where PARAMETER ='NLS_DATE_FORMAT'
wangwei 2014-10-23
  • 打赏
  • 举报
回复
使用YY格式 如果日期中的年份采用的格式为YY,并且只提供了2位的年份,那么就认为这一年的世纪与数据库服务器上当前设置的世纪相同。因此,指定年份的前两位数字与当前年份的前两位数字相同。例如,如果提供的年份是15,而当年是2007年,那么提供的年份就是2015年。同理,如果提供的年份是75,那么就是2075年。 注意: 如果日期中的年份使用YYYY格式,但是只提供了2位的年份,那么Oracle数据库就会使用YY格式来解释日期。 下面来看一个查询,它在处理年份15和75时使用YY格式。在下面这个查询中,注意向TO_DATE()函数输入的年份是15和75,其输出又被传递给TO_CHAR函数,后者将日期转换为DD-MON-YYYY格式的字符串(此处使用了YYYY格式,这样就可以看到TO_DATE函数返回的4位年份)。 SELECTTO_CHAR(TO_DATE('04-JUL-15', 'DD-MON-YY'), 'DD-MON-YYYY'),TO_CHAR(TO_DATE('04-JUL-75', 'DD-MON-YY'), 'DD-MON-YYYY')FROM dual;TO_CHAR(TO_ TO_CHAR(TO_----------- -----------04-JUL-2015 04-JUL-2075 正如期望的一样,15和75分别被解释为2015年和2075年。 使用RR格式 如果日期中的年份采用的格式为RR,并且只提供了最后2位年份,那么年份中的前两位数字就由两部分共同确定:提供年份的两位数字(指定年),数据库服务器上当前日期中年份的后2位数字(当年)。确定指定年世纪的规则如下: ● 规则1 如果指定年在00~49之间,并且当前年份在00~49之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为15,而当前年份为2007,那么指定年就是2015。 ● 规则2 如果指定年在50~99之间,并且当前年份在00~49之间,那么指定年的世纪就等于当前年份的世纪减去1。因此,指定年的前两位数字等于当前年份的前两位数字减去1。例如,如果指定年为75,而当前年份为2007,那么指定年就是1975。 ● 规则3 如果指定年在00~49之间,并且当前年份在50~99之间,那么指定年的世纪就等于当前年份的世纪加上1。因此,指定年的前两位数字等于当前年份的前两位数字加上1。例如,如果指定年为15,而当前年份为2075,那么指定年就是2115。 ● 规则4 如果指定年在50~99之间,并且当前年份在50~99之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为55,而当前年份为2075,那么指定年就是2055。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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