例子:
select ename from emp where hiredate = todate('01/05/81','dd/mm/yy')
和
select ename from emp where hiredate = todate('01/05/81','dd/mm/rr')
返回不同的结果
YY 允许您仅检索年份的两位数字,例如 1999 年的 99。其他数字 (19) 自动分配给当前世纪。RR 通过四舍五入将两位数年份转换为四位数年份。
50-99 存储为 1950-1999,以 00-49 结尾的日期存储为 2000-2049。RRRR 接受一个四位数的输入(尽管不是必需的),并像 RR 一样转换两位数的日期。YYYY 接受 4 位输入,但不进行任何日期转换
本质上,您的第一个示例将假设 81 为 2081,而 RR 假设为 1981。因此,第一个示例不应返回任何行,因为您很可能在 2081 年 5 月 1 日之后还没有雇用任何人:-)
y2k 兼容性。rr 假设 01 为 2001,yy 假设 01 为 1901
参见:http ://www.oradev.com/oracle_date_format.jsp
编辑:该死!michael "quickfingers" stum 打败了我!
/mp
我上一次 Oracle 体验是很久以前的事了
呃,是2000年之前的吗?:p
...
yy 会一直假设为 19xx 吗?
根据您的消息来源,我们得到以下场景:
USING
ENTERED
STORED
SELECT of date column
YY
22-FEB-01
22-FEB-1901
22-FEB-01
YYYY
22-FEB-01
22-FEB-0001
22-FEB-0001
RR
22-FEB-01
22-FEB-2001
22-FEB-01
RRRR
22-FEB-01
22-FEB-2001
22-FEB-2001
/mp
RR 显示四位数字为 1999 或 2015(如果小于 49 则考虑 20 世纪)
当我们插入带有 2 位数年份的日期(即 09/oct/15)时,Oracle 可能会自动更改世纪,因此解决方案是 4 位数日期。但是在最近的一些版本中引入了 4 位版本,因此早期版本中这个问题的解决方案是RR
或RRRR
. 但请注意,它仅适用于TO_DATE()
函数,而不适用于TO_CHAR()
函数。
每当在日期上进行插入/更新时,我们应该始终澄清与日期转换相关的时钟中运行的当前日期,因为 Oracle 通过联系服务器进行每次日期转换。
为了保持世纪之间的一致性,最好使用 4 位数年份执行日期转换。
它接受日期,但没有自动更改日期的功能。
RR 代表 1990 年之后,yy 假设 90 为 2090 年......就像我们在当前年份一样,......