TIMESTAMPDIFF 标量函数 (scalar function)

TIMESTAMPDIFF函数根据两个时间戳之间的差异,返回由第一个参数定义的间隔类型的估计数量。

阅读语法图跳过可视化语法图TIMESTAMPDIFF( 数字表达式, 字符串表达式)

该模式是 SYSIBM。

numeric-expression
返回内置SMALLINT或INTEGER数据类型的值的表达式。 该值指定用于确定两个时间戳之间差别的区间。 下表列出了数字表达式的有效值:
表 1. 数值表达式和等效间隔的有效值,用于确定两个时间戳之间的差异
数值表达式的有效值 等间隔
1 微秒
2
4 分钟
8 小时
16
32 周数
64 月数
128 季度数
256 年数
字符串表达式

返回内置字符串或非LOB图形字符串数据类型的值的表达式。 该值预计为两个时间戳的差值,并转换为长度为22的字符串。 小数点后字符串值不得超过6位。

如果提供的参数是图形字符串,则在执行函数之前将其转换为字符串。
下表描述了字符串表达式的元素:
表 2. TIMESTAMPDIFF 字符串元素
字符串元素 有效值 字符位置从小数点开始(负数在左边)
年数 1-9998或空白 -14到-11
月数 0-11或空白 -10到 -9
0-30或空白 -8 至 -7
小时 0-24或空白 -6 至 -5
分钟 0-59或空白 -4 至 -3
0-59 -2 至 -1
小数分隔符 period 0
微秒 000000-999999 1到6

函数的计算结果是一个与第二个参数具有相同符号的整数。

结果可以为空; 如果任何自变量为空,那么结果为空值。

返回值由下表所示的每个区间确定:

表 3. TIMESTAMPDIFF 计算
结果时间间隔 使用持续时间元素进行计算
年数
季度数 (月数+ years*12 )/3的整数部分
月数 个月 + ( years*12 )
周数 整数值((天数+( months*30 )/7)+( years*52 ))
天 + ( months*30 )+( years*365 )
小时 小时+((天数+( months*30 )+( years*365 ))*24)
分钟(持续时间的绝对值不得超过 40850913020759.999999 ) 分钟 + (小时+((天数+( months*30 )+( years*365 ))*24))*60
秒(持续时间的绝对值必须小于 680105031408.000000 )
秒 + (分+(小时+((天+( months*30 )
+( years*365 ))*24))*60 )*60
微秒(持续时间的绝对值必须小于 3547.483648 ) 微秒 + (秒 + ( minutes*60 ))*1000000

在估算差异时,使用了以下假设:

  • 一年有365天
  • 一年有52周
  • 一年有12个月
  • 一个月有30天
  • 一天有24小时
  • 一小时有60分钟
  • 一分钟有60秒

使用这些假设意味着某些结果值是区间估计值。 请考虑以下示例:

  • 月份少于30天时,相差1个月。
    TIMESTAMPDIFF(16, CHAR(TIMESTAMP('1997-03-01-00.00.00') 
    		- TIMESTAMP('1997-02-01-00.00.00')))

    时间戳算术的结果是 00000100000000.000000 ,即1个月。 当TIMESTAMPDIFF函数的间隔参数(天数)为16时,会假设一个月有30天,结果为30。

  • 不足一个月时,相差一天,不足30天时,相差一天。
    TIMESTAMPDIFF(16, CHAR(TIMESTAMP('1997-03-01-00.00.00') 
    		- TIMESTAMP('1997-02-02-00.00.00')))

    时间戳算术的结果是 00000027000000.000000 ,即27天。 当TIMESTAMPDIFF函数的间隔参数(天数)为16时,结果为27。

  • 在一个月有31天的月份里,相差不到1个月的时间。
    TIMESTAMPDIFF(64, CHAR(TIMESTAMP('1997-09-01-00.00.00') 
    		- TIMESTAMP('1997-08-02-00.00.00')))

    时间戳算术的结果是 00000030000000.000000 ,即30天。 当TIMESTAMPDIFF函数的间隔参数(月份)为64时,结果为0。 持续时间的天数为30,但由于间隔指定为月,因此忽略不计。

示例 :以下语句以月为单位估算员工年龄,并将结果作为AGE_IN_MONTHS返回:
SELECT
  TIMESTAMPDIFF(64, CAST(CURRENT_TIMESTAMP-CAST(BIRTHDATE AS TIMESTAMP)
                AS CHAR(22)))
    AS AGE_IN_MONTHS
  FROM EMPLOYEE;