日期/时间类型

HGDB 支持 SQL 中所有的日期和时间类型,日期根据公历来计算,对于该历法被引入之前的年份也一样。

下表是 HGDB 中的日期/时间类型。

名字 存储尺寸 描述 最小值 最大值 解析度
timestamp [ (p) ] [ without time zone ] 8字节 包括日期和时间(无时区) 4713BC 294276AD 1微秒
timestamp [ (p) ] with time zone 8字节 包括日期和时间,有时区 4713BC 294276AD 1微秒
date 4字节 日期(没有一天中的时间) 4713BC 5874897AD 1日
time [ (p) ] [ without time zone ] 8字节 一天中的时间(无日期) 00:00:00 24:00:00 1微秒
time [ (p) ] with time zone 12字节 仅仅是一天中的时间(没有日期),带有时区 00:00:00+1459 24:00:00-1459 1微秒
interval [ fields ] [ (p) ] 16字节 时间间隔 -178000000年 178000000年 1微秒

注意:

瀚高DB timestamp 等效于 timestamp without time zone ,并且瀚高数据库 鼓励这种行为。timestamptz 被接受为 timestamp with time zone 的一种简写,这 是一种瀚高数据库的扩展。

time、timestamp 和 interval 接受一个可选的精度值 p,这个精度值声明在秒域中小数点之后保留的位数,p 允许的范围是从0到6,缺省情况下,在精度上没有明确的边界。

interval 类型有一个附加选项,可以通过写下面之一的短语来限制存储的 fields 的集合:

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

日期/时间输入

日期和时间的输入可以接受几乎任何合理的格式,包括 ISO 8601、SQL-兼容的、传统的和其他的形式。DateStyle 参数可以指定日期输入的格式,MDY 是“月-日-年”,DMY 是“日-月-年”,YMD 是“年-月-日”。

所有日期或者时间在输入时都需要由单引号包围,就像一个文本字符串一样。

日期和时间的输入可以接受几乎任何合理的格式,包括 ISO 8601、SQL-兼容的、传统的和其他的形式。DateStyle 参数可以指定日期输入的格式,MDY 是“月-日-年”,DMY 是“日-月-年”,YMD 是“年-月-日”。

下表显示了 date 类型可能的输入方式。

例子 描述
1999-01-08 ISO 8601;任何模式下的1月8日(推荐格式)
January 8,1999 在任何 DateStyle 输入模式下都无歧义
1/8/1999 MDY 模式中的1月8日;DMY 模式中的8月1日
1/18/1999 MDY 模式中的1月18日;在其他模式中被拒绝
01/02/03 MDY 模式中的2003年1月2日; DMY 模式中的2003年2月1日; YMD 模式中的2001年2月3日
1999-Jan-08; Jan-08-1999; 08-Jan-1999 任何模式下的1月8日
99-Jan-08 YMD 模式中的1月8日,否则错误
08-Jan-99 Jan-08-99 1月8日,除了在 YMD 模式中错误
19990108 990108 ISO 8601;任何模式中的1999年1月8日
1999.008 年和一年中的日子
J2451187 儒略日期
January 8, 99 BC 公元前99年

时间

当日时间类型是 time [ (p) ] without time zone 和 time [ (p) ] with time zone,只写 time 等效于 time without time zone。这些类型的有效输入由当日时间后面跟着可选的时区组成,时间类型中指定的日期会被忽略,除非使用了一个涉及到夏令时规则的时区,例如 America/New_York。time without time zone 中指定的时区也会被无声地忽略。

例子 描述
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
04:05:06.789-8 ISO 8601
04:05:06-08:99 ISO 8601
04:05-08:00 ISO 8601
040506-08 ISO 8601
04:05:06 PST 缩写指定的时区
2003-04-12 04:05:06 America/New_York 全名指定的时区

时间戳

时间戳类型的有效输入由一个日期和时间的串接组成,后面跟着一个可选的 时区,一个可选的 AD 或者 BC(另外,AD/BC 可以出现在时区前面,但这个顺 序并非最佳)。 因此:

1999-01-08 04:05:06

和:

1999-01-08 04:05:06 -8:00

都是有效的值,它遵循 ISO 8601 标准。

TIMESTAMP ‘2004-10-19 10:23:54’是一个 timestamp without time zone , 而TIMESTAMP ‘2004-10-19 10:23:54+02’

是一个timestamp with time zone 。

日期时间输出

时间/日期类型的输出格式可以设成四种风格之一:ISO 8601、SQL(Ingres)、 传统的 POSTGRES(Unix 的 date 格式)或 German

风格声明 描述 例子
ISO ISO 8601, SQL 标准 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.00PST

注意:

ISO 8601 指定使用大写字母 T 来分隔日期和时间。瀚高数据库在输入上接受 这种格式,但是在输出时它采用一个空格而不是 T,如上所示。和一些其他数 据库系统一样,这是为了可读性以及与 RFC 3339 的一致性。

日期顺序习惯

datestyle设置 输入顺序 例子输出
SQL, DMY 日/月/年 17/12/1997 15:37:16.00CET
SQL, MDY 月/日/年 12/17/1997 07:37:16.00PST
Postgres, DMY 日/月/年 Wed 17 Dec 07:37:16 1997PST