DB2 10.5 for Linux, UNIX, and Windows

基于 TIMESTAMP(0) 的 DATE 数据类型

DATE 数据类型支持使用 Oracle DATE 数据类型的应用程序并期望 DATE 值包括时间信息(例如,“2009-04-01-09.43.05”)。

启用

在创建需要“将 DATE 作为 TIMESTAMP(0)”支持的数据库之前,在数据库级别启用该支持。要启用此支持,请将 DB2_COMPATIBILITY_VECTOR 注册表变量设置为十六进制值 0x40(位位置 7),停止然后重新启动该实例以使新设置生效。
db2set DB2_COMPATIBILITY_VECTOR=40
   db2stop
   db2start
要充分利用 Oracle 应用程序的 DB2 兼容性功能部件,DB2_COMPATIBILITY_VECTOR 的推荐设置是 ORA,这将设置所有兼容性位。

创建启用了“ DATE 作为 TIMESTAMP(0)”支持的数据库之后,将 date_compat 数据库配置参数设置为 ON

如果创建启用了“将 DATE 作为 TIMESTAMP(0)”支持的数据库,那么不能对该数据库禁用该支持,即使您重置 DB2_COMPATIBILITY_VECTOR 注册表变量也是如此。同样,如果创建禁用了“将 DATE 作为 TIMESTAMP(0)”支持的数据库,那么以后不能对该数据库启用该支持,即使通过设置 DB2_COMPATIBILITY_VECTOR 注册表变量也是如此。

作用

date_compat 数据库配置参数指示是否对相连数据库应用了与 TIMESTAMP(0) 数据类型相关联的 DATE 兼容性语义。将 date_compat 设置为 ON 的作用如下所示。

在 SQL 语句中显式遇到 DATE 数据类型后,在大多数情况下,该数据类型隐式映射至 TIMESTAMP(0)。在 CREATE INDEX 语句的 XML 索引规范 子句中指定 SQL DATE 是以上规则的例外。此隐式映射的结果是,消息将引用数据类型 TIMESTAMP 而不是 DATE,并且,任何描述列数据类型或例程数据类型的操作都将返回 TIMESTAMP 而不是 DATE。

日期时间字面值支持更改为如下所示:
  • 显式 DATE 字面值的值为时间部分全部为零的 TIMESTAMP(0) 值。例如,DATE '2008-04-28' 表示时间戳记值“2008-04-28-00.00.00”。
  • 数据库管理器支持对日期的字符串表示使用其他两种格式,这些格式对应于“DD-MON-YYYY”和“DD-MON-RR”。仅支持月份的英语缩写词。例如,可以使用“28-APR-2008”或“28-APR-08”作为日期的字符串表示,这表示 TIMESTAMP(0) 值“2008-04-28-00.00.00”。
    从 V9.7 FP6 开始,数据库管理器还支持日期的字符串表示采用以下格式(仅在英语语言环境中):
    • “DDMONYYYY”或“DDMONRR”
    • “DD-MONYYYY”或“DD-MONRR”
    • “DDMON-YYYY”或“DDMON-RR”
    例如,下列字符串都表示 TIMESTAMP(0) 值“2008-04-28-00.00.00”:
    • “28APR2008”或“28APR08”
    • “28-APR2008”或“28-APR08”
    • “28APR-2008”或“28APR-08”
    有关格式元素的描述,请参阅 TIMESTAMP_FORMAT 标量函数

CURRENT_DATE(又称为 CURRENT DATE)专用寄存器返回与 CURRENT_TIMESTAMP(0) 相同的 TIMESTAMP(0) 值。

对 TIMESTAMP 值加一个数字值或者从 TIMESTAMP 值中减一个数字时,将假定该数字值表示天数。此数字值可以具有任何数字数据类型,任何小数值都将被视为天的小数部分。例如,TIMESTAMP '2008-03-28 12:00:00' + 1.3 将对 TIMESTAMP 值加 1 天又 7 小时 12 分,因此结果为“2008-03-29 19:12:00”。如果使用表达式来表示不足一天的时间,例如 1/24(1 小时)或 1/24/60(1 分钟),请确保 number_compat 数据库配置参数设置为 ON,以便使用 DECFLOAT 算术来进行除法运算。

某些函数的结果会更改:
  • 如果将字符串自变量传递至 ADD_MONTHS 标量函数,那么它返回 TIMESTAMP(0) 值。
  • DATE 标量函数对所有输入类型返回 TIMESTAMP(0) 值。
  • 如果将字符串自变量传递至 LAST_DAY 标量函数,那么它返回 TIMESTAMP(0) 值。
  • 如果将 DATE() 自变量传递至 ADD_MONTHS、LAST_DAY、NEXT_DAY、ROUND 或 TRUNCATE 标量函数,那么此函数返回 TIMESTAMP(0) 值。
  • 将两个日期值相加返回 TIMESTAMP(0) 值。
  • 将两个时间戳记值相减返回 DECFLOAT(34),表示时差(以天数表示)。同样,将两个日期值相减返回 DECFLOAT(34),表示天数
  • 如果为 TO_DATETO_TIMESTAMP 函数指定微秒格式 (FF),那么微秒格式等同于指定 10-9 精度值 (FF9)。
  • TIMESTAMPDIFF 标量函数中的第二个参数不表示时间戳记持续时间。而是表示两个时间戳记之差(以天数表示)。返回的估算值可能因天数不同而变化。例如,如果求“2010-03-31-00.00.00.000000”与“2010-03-01-00.00.00.000000”之差的月数(时间间隔 64),那么结果为 1。这是因为两个时间戳记之差为 30 天,并且假定 1 个月为 30 天。下表显示如何针对每个时间间隔确定返回值。
    表 1. TIMESTAMPDIFF 计算
    结果时间间隔 使用两个时间戳记之差(以天数表示)进行计算
    年数 (天数/365) 的整数值
    季度数 (天数/90) 的整数值
    月数 (天数/30) 的整数值
    周数 (天数/7) 的整数值
    天数 天数的整数值
    小时数 (天数*24) 的整数值
    分钟数(天数的绝对值不得超过 1491308.0888888888888882) (天数*24*60) 的整数值
    秒数(天数的绝对值必须小于 24855.1348148148148148) (天数*24*60*60) 的整数值
    微秒数(天数的绝对值必须小于 0.02485513481481481) (天数*24*60*60*1000000) 的整数值

如果使用导入或装入实用程序将数据输入到 DATE 列中,那么必须使用 timestampformat 文件类型修饰符而不是 dateformat 文件类型修饰符。