TIMESTAMPDIFF
TIMESTAMPDIFF 函数根据两个时间戳记之间的差异,返回第一个自变量定义的类型的估计区间数。
- 数字表达式
- 第一个自变量必须是内置数据类型 INTEGER 或 SMALLINT。 该值指定用于确定两个时间戳记之间的差异的时间间隔。 该时间间隔的有效值如下所示。
表 1. 用于确定两个时间戳记之间的差值的数字表达式和等效区间的有效值 numeric-expression 的有效值 等效区间 第 1 年 微秒 2 秒 4 分钟 8 小时 16 天 32 周 64 月 128 季度 256 年 - string-expression
- string-expression 是减去两个时间戳记并将结果转换为长度为 22 的字符串的结果。 如果 string-expression 在小数点右侧具有超过 6 个数字,那么字符串将截断为 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 小数分隔符 周期 0 微秒 000000-999999 1 到 6
该函数的结果是与 string-expression具有相同符号的整数。 如果任一自变量可以为空,那么结果可以为空; 如果任一自变量为空,那么结果为空值。
将为每个时间间隔确定返回的值,如下表所示:
结果时间间隔 | 使用持续时间元素进行计算 |
---|---|
年 | 年 |
季度 | 整数值 (月 + (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 个月。
- 一个季度有 3 个月。
- 一个月有 30 天。
- 一周有 7 天。
- 一天有 24 小时。
- 一小时有 60 分钟。
- 一分钟有 60 秒。
- 一秒有 1000000 微秒。
使用这些假设意味着某些结果值是区间的估计值。 下面我们来看一看以下示例:
- 月份少于 30 天的 1 个月的差异。
时间戳记算术的结果是持续时间 00000100000000.000000或 1 个月。 当对 interval 自变量 (天数) 调用带 16 的 TIMESTAMPDIFF 函数时,将应用一个月中 30 天的假设,结果为 30。TIMESTAMPDIFF(16, CHAR(TIMESTAMP('1997-03-01-00.00.00') - TIMESTAMP('1997-02-01-00.00.00') ) )
- 1 天小于 1 个月的差值,其中该月的天数小于 30 天。
时间戳记算术的结果是持续时间为 00000027000000.000000或 27 天。 当对 interval 自变量 (天数) 调用带 16 的 TIMESTAMPDIFF 函数时,结果为 27。TIMESTAMPDIFF(16, CHAR(TIMESTAMP('1997-03-01-00.00.00') - TIMESTAMP('1997-02-02-00.00.00') ) )
- 1 天与 1 月之差,其中该月有 31 天。
时间戳记算术的结果是持续时间为 00000030000000.000000或 30 天。 当对 interval 自变量 (月) 调用带 64 的 TIMESTAMPDIFF 函数时,结果为 0。 持续时间的天数部分为 30 ,但由于时间间隔指定的月份而被忽略。TIMESTAMPDIFF(64, CHAR(TIMESTAMP('1997-09-01-00.00.00') - TIMESTAMP('1997-08-02-00.00.00') ) )
示例
- 以下语句估算员工的年龄 (以月为单位) ,并将该值返回为 AGE_IN_MONTHS:
SELECT TIMESTAMPDIFF(64, CAST(CURRENT_TIMESTAMP-CAST(BIRTHDATE AS TIMESTAMP) AS CHAR(22))) AS AGE_IN_MONTHS FROM EMPLOYEE