4.4 日期类型和时间类型
4.4.1 日期类型和时间类型分类
PostgreSQL支持SQL中所有的日期类型和时间类型,相关类型解释如表4-12所示。日期根据公历来计算。
表4-12 日期类型和时间类型数据
time、timestamp和interval接受一个可选的精度值p,这个精度值声明在秒域中小数点之后保留的位数。在默认情况下,在精度上没有明确的边界,p允许的范围是0~6。
interval有一个附加选项,它可以通过下面选项限制存储领域的集合:YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、YEAR TO MONTH、DAY TO HOUR、DAY TO MINUTE、DAY TO SECOND、HOUR TO MINUTE、HOUR TO SECOND、MINUTE TO SECOND。
4.4.2 日期类型和时间类型输入格式
日期类型和时间类型的输入格式包括ISO 8601、SQL、Postgres。
1.日期类型输入
为了避免混淆年月日的顺序,可以通过配置datestyle参数指定顺序。
● 设置为MDY,表示按“月—日—年”的顺序。
● 设置为DMY,表示按“日—月—年”的顺序。
● 设置为YMD,表示按“年—月—日”的顺序。
日期类型的输入格式如表4-13所示。
表4-13 日期类型输入格式
2.时间类型输入
当时间类型是time [(p)] without time zone和time [(p)] with time zone。只写time,等效于time without time zone。时间类型的输入格式如表4-14所示。
表4-14 时间类型输入格式
此外,PostgreSQL支持一些特殊日期和时间输入值,如表4-15所示。这些值中infinity和-infinity在系统内部以特殊方式表示,并且将被原封不动地显示。但是其他的特殊值仅仅只是概念上的缩写,当被系统读到时会转换为正常的日期和时间值。
表4-15 特殊日期和时间输入值
需要注意的是,特殊值now、today、tomorrow及yesterday在被系统读到时立刻转换为一个指定的时间值。
如果日期和时间值作为常量在SQL命令中被使用,则需要将日期和时间值放置在单引号中。
4.4.3 日期类型和时间类型输出格式
日期类型和时间类型的输出格式包括ISO 8601、SQL、Postgres、German。默认输出格式是ISO 8601。
表4-16显示了每种输出格式的实例。日期类型和时间类型的输出格式通常只有日期和时间。
表4-16 日期类型和时间类型输出格式
4.4.4 时区
建议在使用时区时,使用同时包含日期和时间的数据类型。
在系统内部,所有与时区相关的日期和时间都是用UTC存储的。日期在客户端输出之前会被转换成由timezone参数指定的本地时间。
PostgreSQL可以使用3种不同形式指定时区。
1.一个完整的时区名字
例如,America/New_York。能够被识别的时区名字列在pg_timezone_names视图中。PostgreSQL采用IANA时区数据实现该目的,因此,相同的时区名字也可以在其他软件中被识别。
2.一个时区缩写
例如,PST。这样一种声明仅仅定义了到UTC的一个特定偏移,而不像完整时区名那样指出整套夏令时转换日期规则。能够被识别的缩写列在pg_timezone_abbrevs视图中。
3.POSIX时区声明
POSIX时区声明的形式为STDoffset或STDoffsetDST。
● STD是一个区域缩写。
● offset是本地时间相对于UTC时间(通用协调时)的偏移量,该偏移量以小时作为单位。
● DST是一个可选的夏令时区域缩写(被假定为给定偏移量提前一小时)。一个时区缩写可以是一个字母的字符串,或者由尖括号(<>)包围的任意字符串。当时区中包含夏令时区域缩写时,PostgreSQL会根据IANA时区数据库的夏令时转换规则来使用该缩写。
4.4.5 使用日期类型和时间类型运算符
日期类型和时间类型的数据可以使用运算符进行计算,计算对象既可以是普通的日期类型和时间类型数据,也可以是不同单位的时间间隔。表4-17所示为使用日期类型和时间类型运算符(+、*等)的示例。
表4-17 日期类型和时间类型运算符