首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >日期格式符RR和YY的区别

日期格式符RR和YY的区别

作者头像
bisal
发布于 2019-01-29 06:58:59
发布于 2019-01-29 06:58:59
2K0
举报

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1388912

近来有一个应用,连接11g的库,自身逻辑大致是根据日期和其他条件删除表中对应的历史记录,此处日期条件判断未使用to_date(),其中日期和另外一些条件是个复合主键,然后再插入一条新记录(此处日期字段使用to_date(XX, ‘DDMONYY’))。在测试的时候,测试人员发现一个问题,先手工插入了一条2050年的记录,然后执行应用,发现报主键冲突,再追查是因为原先的记录并未删除,导致新插入的记录主键冲突,看起来很诡异的问题,为何没有删除旧的记录?

原因就在于删除的检索条件中日期使用的是DDMONYY日期格式符,但插入的时候没有用任何日期格式符,此时就会使用数据库的默认日期格式符,即:

SELECT * FROM nls_database_parameters

WHERE parameter='NLS_DATE_FORMAT';

9i之后NLS_DATE_FORMAT的默认值就是DD-MON-RR。DDMON月和天的格式化字符都是相同的,对年的格式化字符都是使用的两位,RR和YY,那么现在的问题就是DDMONYY和DDMONRR中对年的判断有何区别?

首先,看DD-MON-RR,以下是官方文档的描述:

The RR Datetime Format Element The RR datetime format element is similar to the YY datetime format element, but it provides additional flexibility for storing date values in other centuries. The RR datetime format element lets you store 20th century dates in the 21st century by specifying only the last two digits of the year.

RR日期格式符和YY日期格式符很相似,但是对于不同世纪,他提供了存储日期值额外的扩展性。RR日期格式符可以让你在21世纪通过仅仅指定年份的后两位来存储20世纪的日期。

If you use the TO_DATE function with the YY datetime format element, then the year returned always has the same first 2 digits as the current year. If you use the RR datetime format element instead, then the century of the return value varies according to the specified two-digit year and the last two digits of the current year.

如果在TO_DATE函数中使用YY格式符,那么只会返回和当前年相同的前两位年费数字。如果使用RR格式符,那就可以根据指定的两位年份数字,还有当前年的后两位数字,返回不同的值。

That is:

  • If the specified two-digit year is 00 to 49, then
代码语言:txt
AI代码解释
复制
- If the last two digits of the current year are 00 to 49, then the returned year has the same first two digits as the current year.
- If the last two digits of the current year are 50 to 99, then the first 2 digits of the returned year are 1 greater than the first 2 digits of the current year.If the specified two-digit year is 50 to 99, then
代码语言:txt
AI代码解释
复制
- If the last two digits of the current year are 00 to 49, then the first 2 digits of the returned year are 1 less than the first 2 digits of the current year.
- If the last two digits of the current year are 50 to 99, then the returned year has the same first two digits as the current year.

如果指定的两位年份数字是00-49,那么

  1. 如果当前年的后两位数字是00-49,则返回的年份和当前年的前两位数字相同。
  2. 如果当前年的后两位数字是50-99,则返回的年份前两位数字会比当前年的前两位数字大1。

如果指定的两位年份数字是50-99,那么

  1. 如果当前年份的后两位数字是00-49,则返回的年份前两位数字会比当前年的前两位数字小1。
  2. 如果当前年的后两位数字是50-99,则返回的年份和当前年的前两位数字相同。

如下示例:

  1. 假设以下查询发生在1950-1999之间: SELECT TO_CHAR(TO_DATE(‘27-OCT-98’, ‘DD-MON-RR’), ‘YYYY’) “Year” FROM DUAL; 1998 SELECT TO_CHAR(TO_DATE(‘27-OCT-17’, ‘DD-MON-RR’), ‘YYYY’) “Year” FROM DUAL; 2017
  2. 假设以下查询发生在2000-2049之间: SELECT TO_CHAR(TO_DATE(‘27-OCT-98’, ‘DD-MON-RR’), ‘YYYY’) “Year” FROM DUAL; 1998 SELECT TO_CHAR(TO_DATE(‘27-OCT-17’, ‘DD-MON-RR’), ‘YYYY’) “Year” FROM DUAL; 2017

不管是2000年之前还是之后执行SQL,查询都会返回相同的值。使用RR日期格式符写的SQL,可以根据不同的年份前两位来返回相同的值。

接下来看看DDMONYY,提供的两位年份数字,此时对于世纪的判断就会和当前数据库服务器设置的世纪相同,例如现在是2015年,使用to_date(‘01JAN50’,’DDMONYY’),那么存入的就是2050-01-01。

再回顾下开始提到的问题,

  1. 测试人员手工插入一条2050年的记录。
  2. 应用首先执行删除操作,此时日期条件没用to_date(),直接用了’01JAN50’,默认使用的则是DDMONRR格式符,当前是2015年,因此实际删除的条件是1950年的记录。当前表中没有1950年的记录,因此删除记录条数是0。
  3. 应用执行插入操作,此时使用的日期查询条件是’01JAN50’,当前是2015年,因此实际要插入的是2015年的记录。但由于表中已经存在一条2050年的记录,因此会报主键冲突的错误。

总结起来,最直接的方式就是使用YYYY或RRRR全年份的表示方式,这样不会有误会,如果使用YY或RR两位表示年份,那就要清楚这两者的区别,以及自己的需求,毕竟Oracle也要根据规则来判断两位年份是哪个世纪的,因此需要选择适合的方式,而且当一次交易中有多次增删改日期条件的逻辑,那么前后使用YY或RR要一致,否则就会因前后条件不一致,导致不同的结果,一个小小的日期格式,包含了不同的理解,显现出了Oracle系统设计的精妙,也对使用者提出来一定的要求,原理比用法更重要。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年10月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQL函数 TO_DATE(一)
名称 TO_DATE 和 TODATE 是可互换的,并且支持 Oracle 兼容性。
用户7741497
2022/08/01
6.1K0
oracle基础|oracle函数的使用|oracle单行函数(字符函数、日期函数、数字函数、转换函数)的使用
前面我们学了一些简单的用法,今天要学习oracl函数的使用,函数是oracle非常重要的功能,如果将函数学会了,那么基本上在项目的一些增删改查功能,就可以很轻松的上手了,所以这篇文章一定要认真的看
小小鱼儿小小林
2021/10/09
8K0
matinal:ORACLE日期时间格式化参数详解
格式化日期指的是将日期转为字符串,或将字符串转为日期,下面几个函数可以用来格式化日期
matinal
2023/10/14
9070
SQL函数 TO_TIMESTAMP
TO_TIMESTAMP 函数将各种格式的日期和时间字符串转换为标准时间戳,数据类型为 TIMESTAMP。 TO_TIMESTAMP 返回具有以下格式的时间戳:
用户7741497
2022/08/02
4.1K0
Oracle常用函数
Create Table Test6( id varchar2(30), name varchar2(30), age number(2), s
郑小超.
2018/01/26
2.1K0
oracle如何格式化日期,Oracle 日期格式化处理汇总[通俗易懂]
2015/04/29 (即返回以’/’分隔符连接的字符串,也可以替换为’^’连接则结果为2015^04^29,也可以替换为’-‘则结果为2015-04-29)
全栈程序员站长
2022/09/05
8.4K0
SQL 基础-->常用函数
lpad | rpad(x,width [,pad_string]) 字符定长,(不够长度时,左|右填充)
Leshami
2018/08/07
1.3K0
SQL函数 TO_POSIXTIME
TO_POSIXTIME 函数将各种格式的日期和时间字符串转换为 %PosixTime 时间戳,数据类型为 %Library.PosixTime。 TO_POSIXTIME 返回 %PosixTime 时间戳作为计算值,该值基于从 1970-01-01 00:00:00 的任意起点经过的秒数,编码为 64 位有符号整数。从该日期开始经过的实际秒数(和小数秒)是 Unix®timestamp,一个数值。 对 Unix® 时间戳进行编码以生成 %PosixTime 时间戳。由于 %PosixTime 时间戳值已编码,因此 1970-01-01 00:00:00 表示为 1152921504606846976。1970-01-01 00:00:00 之前的日期具有负整数值。
用户7741497
2022/08/02
3K0
SQL函数 TO_DATE(二)
可以使用 DDD 将一年中的某一天(自 1 月 1 日以来经过的天数)转换为实际日期。格式字符串 DDD YYYY 必须与由整数天数和四位数年份组成的相应 date_string 配对。 (与 DDD 一起使用时,两位数的年份必须指定为 RR(而不是 YY)。)格式字符串 DDD 默认为当前年份。经过的天数必须是 1 到 365 范围内的正整数(如果 YYYY 是闰年,则为 366)。四位数年份必须在标准 日期范围内:1841 到 9999。DDD 和 YYYY 格式元素可以按任意顺序指定;它们之间的分隔符是强制性的。以下示例显示了这一年中的一天的用法:
用户7741497
2022/08/01
1.7K0
oracle的todate函数的日期格式_oracle limit的用法
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说oracle的todate函数的日期格式_oracle limit的用法,希望能够帮助大家进步!!!
Java架构师必看
2022/09/12
13.1K0
oracle的todate函数的日期格式_oracle limit的用法
Oracle函数 – 日期函数详解
SYSDATE:取得当前的日期和时间,类型是DATE.它没有参数.但在分布式SQL语句中使用时,SYSDATE返回本地数据库的日期和时间.
星哥玩云
2022/08/17
7.9K0
Oracle函数 – 日期函数详解
SQL函数 TO_CHAR(一)
名称 TO_CHAR 和 TOCHAR 是可互换的,并且支持 Oracle 兼容性。
用户7741497
2022/08/01
4.6K0
JavaScript日期格式化及解析
JavaScript开发经常需要对日期进行转换,把日期转成字符串或者从字符串生成日期。JavaScript日期对象内置了简单的日期格式化方法toString()和日期解析方法Date.parse(),这两个方法有较大的局限性,不能自定义自定义日期格式化和解析的字符串格式。下面列出一些常用的日期处理JS库。
全栈程序员站长
2022/09/01
2K0
Oracle日期处理
TRUNC(date)函数返回date当天的时间部分被格式模型fmt截断到指定的单位
WindCoder
2020/02/10
1.4K0
SQL函数 CONVERT
这里描述了CONVERT函数的两种不同实现。 两者都将一种数据类型中的表达式转换为另一种数据类型中的相应值。 两者都执行日期和时间转换。
用户7741497
2022/03/28
5.5K1
MySQL数据类型--日期时间
  自接触学习MySQL已有一段时间了,对于MySQL的基础知识还是有一定的了解的。在这一路学习过来,每次不管看书还是网上看的资料,对于MySQL数据类型中的时间日期类型总是一扫而过,不曾停下来认认真真的研究学习。最近在图书馆借了一本关于MysQL的书籍,打算全面的学习研究一遍。
那一叶随风
2018/08/22
3.7K0
MySQL数据类型--日期时间
Mysql 日期格式转换
DATE_FORMA T(date, format) 根据格式串format 格式化日期或日期和时间值date,返回结果串。
全栈程序员站长
2022/07/02
7.2K0
oracle隐式转换_oracle查看游标数量
原文地址:http://blog.itpub.net/29324876/viewspace-1096741/
全栈程序员站长
2022/11/10
2.2K0
shell中日期格式化
date1=$(date --date='1 days ago +%Y%m%d') #前一天的日期
编程那点事
2023/02/25
1.7K0
【重学 MySQL】三十二、日期时间函数
GET_FORMAT函数中date_type和format_type参数取值如下:
用户11332765
2024/10/28
3290
【重学 MySQL】三十二、日期时间函数
相关推荐
SQL函数 TO_DATE(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档