日期/时间类型
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 |