TIMESTAMPDIFF 标量函数 (scalar function)
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
函数的计算结果是一个与第二个参数具有相同符号的整数。
结果可以为空; 如果任何自变量为空,那么结果为空值。
返回值由下表所示的每个区间确定:
| 结果时间间隔 | 使用持续时间元素进行计算 |
|---|---|
| 年数 | 年 |
| 季度数 | (月数+ 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;