`
suoyihen
  • 浏览: 1359063 次
文章分类
社区版块
存档分类
最新评论

《Oracle编程艺术》学习笔记(36)-数据类型-时间日期

阅读更多
固有数据类型DATE、TIMESTAMP和INTERVAL紧密相关。
DATE和TIMESTAMP存储精度可变的固定日期/时间。INTERVAL可以存储一个时间量。

1)DATE
7字节的定宽日期/时间数据类型。
总包含7个属性,包括:世纪、世纪中哪一年、月份、月中的哪一天、小时、分钟和秒。

2)TIMESTAMP [(fractional_seconds_precision)]
7字节或11字节的定宽日期/时间数据类型。
与DATE相比,还可以包含0~9小数位秒(fractional second)。默认6个小数位。

3)TIMESTAMP[(fractional_seconds)] WITH TIME ZONE
13字节的定宽TIMESTAMP,还提供了时区(TIME ZONE)支持。数据中会随TIMESTAMP存储有关时区的额外信息。

4)TIMESTAMP WITH LOCAL TIME ZONE
与TIMESTAMP类似,7字节或11字节的定宽日期/时间数据类型。
存入数据库时,把数据中的日期/时间部分转换为按照数据库时区表示的日期/时间。
获取数据时,把数据中的日期/时间部分转换为按照会话的时区表示的日期/时间。

5)INTERVAL[(year_precision)] YEAR TO MONTH
5字节的定宽数据类型,用于存储一个时间段,这个类型将时段存储为年数和月数。
year_precision可以为0~9个数字,默认值2。
可以在日期运算中使用这种时间间隔使一个DATE 或TIMESTAMP类型增加或减少一段时间。

6)INTERVAL DAY[(day_precision)] TO SECOND [(fractional_seconds)]
11字节的定宽数据类型,用于存储一个时段,这个类型将时段存储为天/小时/分钟/秒数。
day_precision可以为0~9个数字,默认值2。
fractional_seconds可以为0~9个数字,默认值6。

将一个表示DATE、TIMESTAMP 或INTERVAL的串发送到数据库时就应该指定格式。不要依赖于默认格式。

利用TRUNC函数截断DATE

向DATE加减时间


需要注意,一般应该使用ADD_MONTHS来处理年和月,而不要使用NUMTOYMINTERVAL,因为这2个函数处理月末日期的行为不一样。


计算两个DATE之差
1)两个DATE相减得到相隔天数(包括小数)
2)使用MONTHS_BETWEEN函数得到相隔月数(包括小数)
3)使用INTERVAL类型可以查看2个日期之间的时间
例如,计算2个日期之间相隔的年数、月数、天数、小时数、分钟数和秒数。


向TIMESTAMP 加减时间
DATE执行日期算术运算所用的方法适用于TIMESTAMP,但是直接加减数字和add_months会导致TIMESTAMP到DATE的隐式转换。
所以一般使用INTERVAL来进行时间加减,但是需要注意月末日期可能导致的问题。


计算两个TIMESTAMP之差
这一点上,DATE和TIMESTAMP类型存在显著差异。
将DATE相减的结果是一个NUMBER(间隔天数),但TIMESTAMP相减的结果却是一个INTERVAL。


支持时区(TIME ZONE)的TIMESTAMP类型
有两种支持时区的TIMESTAMP类型:TIMESTAMP WITH TIME ZONE和TIMESTAMP WITH LOCAL TIME ZONE。
TIMESTAMP WITH TIME ZONE类型存储的时候保留了时区信息,TIMESTAMP WITH LOCAL TIME ZONE则根据会话时区和数据库时区,将时间转换为数据库时区后进行存储,读取时则转换为相应的会话时区表示的时间。
如果不需要记住源时区,只需要这样一种数据类型,要求能对日期/时间类型提供一致的全球性处理,那么TIMESTAMP WITH LOCAL TIME ZONE 对大多数应用来说已经能提供足够的支持。

数据库时区可以在创建数据库时用set time_zone=...子句来指定。默认是+00:00。
可以用alter session/database set time_zone=...语句来更改时区。
可以用以下语句查询数据库时区和会话时区。


下面的例子可以看出来这两种类型的区别。


此外,一旦在数据库中创建了包含TIMESTAMP WITH LOCAL TIME ZONE类型数据的表格,并插入了数据,就不能更改数据库时区了。
因为如果可以修改,在新时区下,无法得到正确时间。


INTERVAL YEAR TO MONTH类型
可以使用以下办法创建INTERVAL YEAR TO MONTH类型的实例
1)NUMTOYMINTERVAL 函数
2) TO_YMINTERVAL函数
3) 直接在SQL中使用INTERVAL类型

例如,


INTERVAL DAY TO SECOND类型
可以使用以下办法创建INTERVAL DAY TO SECOND类型的实例
1)NUMTODSINTERVAL 函数
2) TO_DSINTERVAL函数
3) 直接在SQL中使用INTERVAL类型


EXTRACT 函数
可以使用EXTRACT函数从DATE, TIMESTAMP 和INTERVAL中返回各部分信息。
EXTRACT(
{ YEAR | MONTH | DAY |HOUR | MINUTE | SECOND } |
{ TIMEZONE_HOUR |TIMEZONE_MINUTE } |
{ TIMEZONE_REGION }|
TIMEZONE_ABBR }
FROM x)
例如:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics