Oracle PL/SQL 程序设计读书笔记 - 第10章 日期和时间戳
Oracle PL/SQL 程序设计读书笔记 - 第10章 日期和时间戳
10.1 Datatime数据类型
- DATA:存储日期和时间,能精确到秒。不带时区信息
- TIMESTAMP:存储日期和时间,不带时区。时间精度可以到达十亿分之一秒(小数点后9位)。
- TIMESTAMP WITH TIME ZONE:存储时区,日期和时间,精度达到小数点后9位
- TIMESTAMP WITH LOCAL TIME ZONE:保存日期和精确到小数点后9位的时间,这个数据类型是对时区敏感的。当这个值保存到数据库时,也会转换成数据库时区,而不是保存本地时区。当从数据库提取数据时,这个值又会从数据库的时区转换成本地时区。
解释:
DATA和TIMESTAMP只是时间的精度不同两个都不存储时区相关的内容,TIMESTAMP WITH TIME ZONE是存储时区的,不会自动为用户转换但会告诉用户存储的时间是属于哪个时区的。TIMESTAMP WITH LOCAL TIME ZONE会根据取得用户人的本地时区进行錾
UTC:协调世界时间,使用的是高度精确的原子钏进行测算,也作为世界民用时间系统的基础。
10.1.1 声明日期时间变量
var_name [CONSTANT] datetime_type [{:=| DEFAULT} initial_value]
其中datetime_type可以用下面任意一种类型:
- DATE
- TIMESTAMP [(precision)]
- TIMESTAMP [(precision)] WITH TIME ZONE
- TIMESTAMP [(precision)] WITH LOCAL TIME ZONE
precesion是用来记录小数的秒的小数位数。缺省的精度是6。允许的精度范围从0到9。
提示:一个TIMESTAMP(0)变量就相当于一个DATE变量。
10.2 得到当前日期和时间
- CURRENT_DATE:会话的时区。类型:DATE
- CURRENT_TIMESTAMP:会话的时区。类型:TIMESTAMP WITH TIME ZONE
- LOCALTIMESTAMP:会话的时区。类型:TIMESTAMP
- SYSDATE:数据库服务器的时区。类型:DATE
- SYSTIMESTAMP:数据库服务器的时区。类型:TIMESTAMP WITH TIME ZONE
函数SESSIONTIMEZONE和DBTIMEZONE分别报告了你的会话时区和数据库时区。
10.3 INTERVAL数据类型
- INTERVAL YEAR TO MONTH:允许我们用年和月定义时间间隔
- INTERVAL DAY TO SECOND:允许我们用天,小时,分钟和秒定义时间间隔。
之所以会有两个以月份为分隔的INTERVAL类型,是因为在所有日期时间的成分中只有月份的时间长度会变。
10.3.1 声明INTERVAL变量
var_name INTERVAL YEAR [(YEAR_PRECISION)] TO MONTH
var_name INTERVAL YEAR [(YEAR_PRECISION)] TO SECOND [(frac_sec_prec)]
其中: - varname:是要声明的INTERVAL变量的名字 - yearprecision:代表年的位数(0到4)。缺省是2 - dayprecision:代表日期的位数(0到9)。缺省是2 - fracsec_prec:秒的小数部分的位数(0到9),缺省是6
10.4 日期时间转换
- PL/SQL确认的可以的日期范围是从公元前4712年1月1日,到公元后9999年12月31日。
10.4.1 从字符串到日期时间
隐匿类型转换依赖于NLSDATEFORMAT参数的设置。默认是dd-mon-yyyy。
TO_DATE(string[,format_mask[,nls_language]])
TO_DATE(number[,format_mask[,nls_language]])
TO_TIMESTAMP(string[,format_mask[,nls_language]])
TO_TIMESTAMP_TZ(string[,format_mask[,nls_language]])
nls_language用于指定按照哪种语言翻译字符串中月份和日期的名字及缩写。
-传给TO_DATE函数的要转换成日期的直接量不能长于220个字符
-不能在一个格式掩码中同时出现Julian日期元素(J)和年日元素(DDD)
-日期/时间中的一个成员在掩码中不能有多个元素对应。
-同一个掩码中不能同时有24小时时间格式和子午元素。
10.4.2 从日期时间到字符串
TO_CHAR(date[,format_mask[,nls_language]])
如果希望结果是国家字符集,可以用TONCHAR代替TOCHAR
10.4.6 解释没去窗口中两位数字的年份
- 如果当前的年份落在了头半个世界中(0-49)
- 如果输入的日期在头半个世纪(0-49),RR返回的是当前世纪
- 如果输入的日期在后半个世纪(50-99),RR返回的是前一个世纪
- 如果当前的年份落在了后半个世界中(50-99)
- 如果输入的日期在头半个世纪(0-49),RR返回的是下一个世纪
- 如果输入的日期在后半个世纪(50-99),RR返回的是当前世纪
10.5 日期和时间戳直接量
DATE 'YYYY-MM-DD'
TIMESTAMP 'YYYY-MM-DD HH:MI:SS[.FFFFFFFFF] [{ + | - }HH:MI]'
日期和时间戳直接量的格式是由ANSI/ISO标准规定的,无论是你还是DBA都不能修改。
10.7 时间间隔直接量
INTERVAL 'character_pepresentation' start_element TO end_element
10.8 CAST和EXTRACT
10.8.1 CAST函数
10.8.2 EXTRACT函数
EXTRACT函数用于从一个日期时间值中提取日期部分。
EXTRACT(component_name, FROM {datetime | interavl})