跳到主要内容

PERIOD_DIFF

描述

计算两个周期之间的月份差值。

其中 <period> 是一个整数,最后两位表示月份(01-12),前面的数字表示年份。 函数返回period_1 - period_2的绝对结果。

若年份部分小于 100 会按一定规则补为四位数年份格式处理。

该函数与 MySQL 的 PERIOD_DIFF 函数 行为一致。

语法

PERIOD_DIFF(`<period_1>`, `<period_2>`)

参数

参数说明
<period_1>代表一个由年和月组成的周期。
  • 格式:月份固定占末尾两位,必须在 [1, 12] 范围内。前面的数字表示年份,年份位数不限,可以超过四位。
  • 年份推断:年份取值直接使用除最后两位外的所有数字。当年份为两位数(范围:[00, 99]), 此时若年份小于 70 则解读为 20YY,若大于等于 70 则解读为 19YY。
  • 值范围:接受 [0, 2^63-1] 范围内的整型参数。
<period_2>代表另一个周期,格式要求与 <period_1> 相同。

返回值

返回一个整型,表示<period_1> 的总月份数减去 <period_2> 的总月份数的值。

当任一参数为 NULL,因数值无法转换为 BIGINT 时,返回 NULL。

当参数为负数或其月份部分无效时,函数将报错。

举例

SELECT `period_1`, `period_2`, PERIOD_DIFF(`period_1`, `period_2`) AS DIFF FROM `test_period_diff`;
+---------------------+----------+---------------------+
| period_1 | period_2 | DIFF |
+---------------------+----------+---------------------+
| 200802 | 200703 | 11 |
| 200703 | 200802 | -11 |
| 7001 | 6912 | -1199 |
| NULL | 2510 | NULL |
| 2510 | NULL | NULL |
| 9223372036854775807 | 101 | 1106804644422549090 |
| 9223372036854775808 | 101 | NULL |
+---------------------+----------+---------------------+

最后一行中period_1超出了BIGINT的上限(2^63-1), 故输出 NULL

SELECT PERIOD_DIFF(1, -1);
-- ERROR 1105 (HY000): errCode = 2, detailMessage = (127.0.0.1)[INVALID_ARGUMENT]Period function got invalid period: -1