深入浅出PostgreSQL
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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 日期类型和时间类型运算符