DATETIME 数据类型

DATETIME 数据类型会存储以日历日期和一天中的时间表示的瞬间时刻。

您选择存储 DATETIME 值的精确度;其精度范围可从一年到几分之一秒。

DATETIME 将数据值存储为在数据类型声明中表示每个时间单位(等等)的连续字段序列。

用于指定 DATETIME 数据类型的字段限定符具有以下格式:
DATETIME largest_qualifier TO smallest_qualifier
这类似于 INTERVAL 字段限定符,但 DATETIME 表示时间点而不是时间范围(INTERVAL 表示时间范围)。DATETIME 和 INTERVAL 限定符之间存在如下差异:
  • DATETIME 关键字替换 INTERVAL 关键字。
  • DATETIME 字段限定符不能指定 largest_qualifier 时间单位的非缺省精度。
  • DATETIME 数据类型的字段限定符可以包含 YEAR、MONTH 和更小的时间单位,而包含 DAY 字段限定符(或更小时间单位)的 INTERVAL 数据类型不能还包含 YEAR 或 MONTH 字段限定符。

如果 smallest_qualifier 未指定大于 largest_qualifier 的时间单位,那么 DATETIME 数据类型的 largest_qualifiersmallest_qualifier 可以是下表列出的任何字段。(最大和最小时间单位可以相同;例如,DATETIME YEAR TO YEAR。)

表 1. DATETIME 字段限定符
限定符字段 有效条目
YEAR 从 1 到 9,999(公元)编号的年份
MONTH 从 1 到 12 编号的月份
DAY 从 1 到 31 编号的日(适合于月)
HOUR 从 0(午夜)到 23 编号的小时
MINUTE 从 0 到 59 编号的分钟
SECOND 从 0 到 59 编号的秒
FRACTION 最多具有 5 位小数位的秒的十进制小数。缺省小数位是 3 位(千分之一秒)。对于 smallest_qualifier,要指定另一个小数位,请写 FRACTION(n),其中 n 是位数(从 1 到 5)。

DATETIME 列的声明不需要包括全部 YEAR 至 FRACTION 时间单位范围。它可以包括这些时间单位的任何连续子集,或者甚至仅包括单个时间单位。

例如,如果每个输入的值都包含连续的时间单位系列的信息,就可以在声明为 YEAR TO MINUTE 的列中输入 MONTH TO HOUR 值。但是,不能只输入 MONTH 和 HOUR 的值;条目中还必须包括 DAY 的值。

如果使用 DB-Access TABLE 菜单,并且未指定 DATETIME 限定符,那么会指定缺省 DATETIME 限定符 YEAR TO YEAR。

有效的 DATETIME 文字必须包含 DATETIME 关键字、要输入的值和字段限定符。如前面说明的那样,由于输入的值可包含比对列声明的字段数少的字段,所以必须包括这些限定符。第一个字段和最后一个字段的可接受限定符与表 1 列出的有效 DATETIME 字段的列表完全相同。

将字段限定符的值用整数表示并用定界符隔开这些限定符。下表列出了在缺省的美国英语语言环境中与 DATETIME 值配合使用的定界符。(这些定界符是在 INTERVAL 值中使用的定界符的超集。)

表 2. 与 DATETIME 配合使用的定界符
定界符 在 DATETIME 文字中的位置
连字符 ( - )( = ) 在 YEAR、MONTH 和 DAY 时间单位值之间
空格 ( ) 在 DAY 与 HOUR 时间单位值之间
冒号 ( : ) 在 HOUR、MINUTE 与 SECOND 时间单位值之间
小数点 ( . ) 在 SECOND 与 FRACTION 时间单位值之间
下图显示具有定界符的 DATETIME YEAR TO FRACTION(3) 值。

图: 具有定界符的 DATETIME 值示例


字符串“2003-09-23 12:42.06.001”是 2003 年的字面值,其中“-09-23”是九月份的第 23 天,“12:42.06.001”表示中午 12 点后的 42 分 6 秒零 1/1000 秒。结束图片描述

当输入具有比列中的时间单位字段少的时间单位字段的值时,就会自动扩展输入的值以填满所有声明的时间单位字段。如果漏掉任何较高有效字段(即,时间单位大于包含的任何时间单位),那么会用系统时钟日历中的那些时间单位的当前值自动填充这些字段。如果漏掉任何不太重要的字段,那么在条目中会用零(或对 MONTH 和 DAY 使用 1)填充这些字段。

还可以将 DATETIME 值作为字符串输入。字符串必须包括 DATETIME 列中定义的每个字段的信息。下面示例中的 INSERT 语句显示了作为字符串输入的 DATETIME 值:
INSERT INTO cust_calls (customer_num, call_dtime, user_id,
              call_code, call_descr)
          VALUES (101, '2001-01-14 08:45', 'maryj', 'D',
       'Order late - placed 6/1/00');

如果将 call_dtime 声明为 DATETIME YEAR TO MINUTE,那么字符串必须包含小时分钟字段的值。

如果字符串不包含所有已声明字段的信息(或如果它添加了其他字段),那么数据库服务器会返回错误。

除了 yearfraction 字段之外,DATETIME 列的所有字段都是 2 位数。year 字段存储为 4 位。当在年份字段中输入两位值时,缩写的年份扩展为四位的方式取决于 DBCENTURY 环境变量的设置。

例如:如果输入 02 作为 year 值,那么将该年份是解释为 19022002 还是 2102 取决于 DBCENTURY 的设置和执行时系统时钟日历的值。如果不设置 DBCENTURY,那么在缺省情况下,将追加当前年份的前导数字。

小数字段需要 n 位数,其中 1 ≤ n ≤ 5,上舍入为偶数。可以使用以下公式(上舍入为整数个字节)来计算 DATETIME 值需要的字节数:
(所有字段的总位数)/2 + 1

例如,YEAR TO DAY 限定符总共需要八位(四位用于,两位用于,两位用于)。根据公式,此数据值需要 5(即 (8/2) + 1)个字节的存储器。

当数据库服务器在 SQL 语句中从操作系统获取当前时间时,USEOSTIME 配置参数可能会影响亚秒级粒度。有关详细信息,请参阅 GBase 8s 管理员参考

使用 ESQL API 时,DBTIME 环境变量会影响 DATETIME 格式。GL_DATEDBDATE 环境变量的非缺省语言环境和设置还会影响日期时间数据的显示。但是,它们不会影响 DATETIME 列的内部存储格式。

如果指定的语言环境不是美国英语,那么该语言环境为 DATETIME 值定义特定于文化的显示格式。要更改缺省显示格式,更改 GL_DATETIME 环境变量的设置。当具有非缺省语言环境的数据库使用非缺省 GL_DATETIME 设置时,USE_DTENV 环境变量必须设置为 1,数据库服务器才能在以下运算中正确处理本地化的 DATETIME 值:
  • 使用 DB-Access 的 LOAD 或 UNLOAD 功能
  • 使用 dbexportdbimport 迁移实用程序
  • 对 CREATE EXTERNAL TABLE 语句定义的数据库表或对象使用 SQL 的 DML 语句。

有关语言环境和可以指定最终用户 DATETIME 格式的 GLS 环境变量的更多信息,请参阅《GBase 8s GLS 用户指南》。