PostgreSQL
上一页 第三章. 数据类型 下一页

日期/时间类型

PostgreSQL 支持 SQL 中所有的日期和时间类型。

表 3-7. Postgres 日期/时间 类型
 
类型 描述 存储 最早 最晚 精度
timestamp 用于包含日期和时间的数据 8 bytes 4713 BC AD 1465001 1 microsec / 14 digits
interval 用于时间间隔 12 bytes -178000000 years 178000000 years 1 mircosecond
date 用于只包含日期的数据 4 bytes 4713 BC 32767 AD 1 day
time 用于只包含时刻的数据 4 bytes 00:00:00.00 23:59:59.99 1 microsecond

注意:为了保证和早期 PostgreSQL 版本的兼容,我们还继续提供 datetime(等效于timestamp)和timespan(等效于interval)。不过对这些类型的支持现在局限于进行一个隐含的转换,转换成timestamp 和 interval。类型abstime和 reltime 是低分辨率类型,它们被用于系统内部。我们不鼓励你在新的应用里面使用这些类型,同时我们支持合适的时候把旧应用中对应的类型转换成目前上面指明的。因为这些旧类型的部分或全部在未来的版本里可能消失。

日期/时间输入

日期和时间的输入几乎可以是任何合理的格式,包括ISO-8601SQL-兼容的,传统 Postgres 的和其他形式的。日期输入里的月份和日子输入可以是模糊的,因此存在一个设置用来表明具体应该如何解释。命令 SET DateStyle TO 'US'SET DateStyle TO 'NonEuropean' 表示设置为“月份在日子前面”,而命令 SET DateStyle TO 'European' 表示设置为“日子在月份前面”。缺省是 ISO 风格,但是缺省值可以在编译或者运行时改变。

参阅 日期/时间 支持 获取关于日期/时间输入的准确的分析规则和可识别的时区的信息。

记住任何日期或者时间输入需要被单引号包围,就象一个文本字符串一样。

date(日期)

下表是 date 类型可能的输入方式。

表 3-8. PostgreSQL 日期输入
 
例子 描述
January 8, 1999 无模糊
1999-01-08 ISO-8601 格式,建议方式
1/8/1999 US;在 European 模式下读做八月一日
8/1/1999 European;在 US 模式下读做八月一日
1/18/1999 US;在任何模式下都读做一月十八日
1999.008 年和年里的第几天
19990108 ISO-8601 年,月,日
990108 ISO-8601 年,月,日
1999.008 年和年里的第几天
99008 年和年里的第几天
January 8, 99 BC 公元前99年

表 3-9. PostgreSQL 月份缩写
 
月份 缩写
April(四月) Apr
August(八月) Aug
December(十二月) Dec
February(二月) Feb
January(一月) Jan
July(七月) Jul
June(六月) Jun
March(三月) Mar
November(十一月) Nov
October(十月) Oct
September(九月) Sep, Sept

注意: 五月(May)没有缩写,原因是显而易见的。
表 3-10. PostgreSQL 星期缩写
 
星期 缩写
Sunday(星期天) Sun
Monday(星期一) Mon
Tuesday(星期二) Tue, Tues
Wednesday(星期三) Wed, Weds
Thursday(星期四) Thu, Thur, Thurs
Friday(星期五) Fri
Saturday(星期六) Sat

time(时间)

下面是有效的 time (时间)输入

表 3-11. PostgreSQL 时间输入
 
例子 描述
04:05:06.789 ISO-8601,所有的时间域
04:05:06 ISO-8601
04:05 ISO-8601
040506 ISO-8601
04:05 AM 与04:05一样;AM 不影响数值
04:05 PM 与 16:05一样;输入小时数必须 <= 12
z 与 00:00:00 一样
zulu 与 00:00:00 一样
allballs 与 00:00:00 一样

带时区时间

这个类型是 SQL92 定义的,但是该定义显示出非常基本的不足,使得这个类型几乎无用。在多数情况下,datetime 和 timestamp 的组合应该能提供任何应用所需要的日期/时间功能的全部范围。

带时区时间 接受所有对 time 类型也合法的输入,附加一个合法的时区,如下:

表 3-12. Postgres 带时区时间输入
 
例子 描述
04:05:06.789-8 ISO-8601
04:05:06-08:00 ISO-8601
04:05-08:00 ISO-8601
040506-08 ISO-8601

参考 Postgres 时区输入 获取时区的更多例子。

timestamp(时标)

有效的 timestamp 类型的输入包含一个日期和一个时间的连接,后面跟着可选的 ADBC,再后面跟着可选的时区。(参阅下面。)因此
1999-01-08 04:05:06 -8:00
是一个有效的 timestamp 值,它是 ISO-兼容的。另外,已经广泛使用的格式
January 8 04:05:06 1999 PST
也是支持的。

表 3-13. PostgreSQL 时区输入
 
时区 描述
PST 太平洋标准时间(Pacific Standard Time)
-8:00 ISO-8601 与 PST 的偏移
-800 ISO-8601 与 PST 的偏移
-8 ISO-8601 与 PST 的偏移

interval(时间间隔)

interval 可以用下面语法声明:
  Quantity Unit [Quantity Unit...] [Direction]
@ Quantity Unit [Direction]
这里:Quantity 是 ...,-1012,...;Unitsecondminutehourdayweekmonthyeardecadecenturymillenium,或者这些单位的缩写或复数;Direction 可以是 ago 或者为空。

特殊值

下面的SQL-兼容的函数可以用于对应的数据类型的日期或时间输入:CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP

PostgreSQL 为方便期间同样还支持几个特殊常量。

表 3-14. PostgresSQL 日期/时间 特殊常量
 
常量 描述
current 当前事务时间, (使用时)deferred
epoch 1970-01-01 00:00:00+00 (Unix 系统零时)
infinity 比任何有效时间晚
-infinity 比任何有效时间早
invalid 非法输入
now 当前事务时间
today 今日午夜
tomorrow 明日午夜
yesterday 昨日午夜

'now' 在该值被插入时解释,'current' 在每次检索该值时被解释。所以你可能会在大多数应用里使用 'now'。(当然你真的想用 CURRENT_TIMESTAMP 的话也行,它等效于 'now'。)

日期/时间输出

使用 SET DateStyle,输出格式可以设成四种风格之一: ISO-8601, SQL (Ingres),传统的 Postgres,和 German 风格。缺省是 ISO 格式。

表 3-15. PostgreSQL 日期/时间 输出风格
 
风格描述 描述 例子
'ISO' ISO-8601 标准 1997-12-17 07:37:16-08
'SQL' 传统风格 12/17/1997 07:37:16.00 PST
'Postgres' 原始风格 Wed Dec 17 07:37:16 1997 PST
'German' 地区风格 17.12.1997 07:37:16.00 PST

日期时间风格的输出当然只是对应上面例子的日期或者时间部分。

SQL 风格有欧洲和非欧洲(US)变种, 决定月份后面是日期还是正相反.(参阅上面日期/时间输入部分,看看这个设置是如何影响对输入值的解释。)

表 3-16. PostgreSQL 日期顺序传统
 
风格 描述 例子
European // 17/12/1997 15:37:16.00 MET
US // 12/17/1997 07:37:16.00 PST

interval 的输出看起来象输入格式,只是象 weekcentury 这样的单位被转换成年和日。在 ISO 模式下输出看起来象

[ Quantity Units [ ... ] ] [ Days ] Hours:Minutes [ ago ]
有几种方法可以影响日期/时间类型的输出:

时区

Postgres 在典型应用中尽可能与SQL92 的定义相兼容.但 SQL92 标准在日期和时间类型和功能上有一些奇怪的混淆.两个显而易见的问题是: 然而,现实世界的时区只有在与时间和日期都关联时才有意义,因为时间偏移量(时差)可能因为实行类似夏时制这样的制度而在一年里有所变化.

为了克服这些困难, Postgres 只将日期和时间类型(同时包含日期和时间)与时区相关联,并且假设任何类型的当地时间只包含日期或时间.另外,时区的支持从操作系统的时区功能中引入,这样就可以处理夏时制或其他可知的因素.

Postgres 从操作系统获得介于1902年和2038年的日期的时区支持(近乎是典型的Unix类系统的日期限制).在这个范围之外的日期都假设为用全球统一时间(Universal Coordinated Time,UTC)声明和使用。

在系统内部,所有日期和时间都是用全球统一时间(UTC)格式存储,也就是通常所说的格林威治时间(GMT).时间在发给客户前端前由数据库服务器转换成本地时间,因而缺省的时区是服务器的时区.

有几种影响时区特性的方法:

如果使用了非法的时区,时区变为GMT(在大多数系统上)。
注意:如果设置了编译选项 USE_AUSTRALIAN_RULES,那么 EST 代表澳大利亚东部标准时间,( Australia Eastern Std Time)与UTC有 +10:00 小时的偏移量。

内部

Postgres 用 Julian 记日法用于所有日期/时间计算。如果假设一年的长度是365.2425天时,这个方法可以很精确地预计/计算从4713BC(公元前4713年)到很久的未来的任意一天的日期。

19世纪以前的日期传统(历法)对一些趣味读物有意义,但是在我们这里好象没有充分的理由把它们编码入日期/时间控制器里面去。


上一页 首页 下一页
字符类型 开头 布尔类型