首页 > 解决方案 > 无法获得年月间隔

问题描述

我正在学习 PL-SQL,练习是找出两个日期之间的年月间隔差异。我写了以下代码:

DECLARE
  t1 TIMESTAMP (2) WITH TIME ZONE :=  to_timestamp_tz('2019-01-21 21:05:53.46 +02:00',
                        'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM');
  t3 TIMESTAMP WITH TIME ZONE := to_timestamp_tz('2020-01-21 21:05:53.46 +02:00',
                        'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM');                       
  ym INTERVAL YEAR(2) to MONTH;   
BEGIN
--  ym := '10-2';
  ym := t3-t1;
  DBMS_OUTPUT.PUT_LINE(ym);
END;

我希望 ym 变量给出 '01-0' (1 年的差异),但我得到一个错误:

Error report -
ORA-06550: line 9, column 9:
PLS-00382: expression is of wrong type
ORA-06550: line 9, column 3:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

我真的很困惑为什么会发生这种情况,我尝试更改 的精度YEAR(_),但这无济于事。

如果ym是 datatype INTERVAL DAY(2) to SECOND(2),我会得到正确的结果。如果我将 ym 替换为ym := '10-2';它也可以。但ym INTERVAL YEAR(2) to MONTH它不起作用:(

标签: oracleplsql

解决方案


t3-t1不起作用,因为结果值是INTERVAL DAY TO SECOND数据类型并且没有隐式转换为INTERVAL YEAR TO MONTH.

相反,您可以使用NUMTOYMINTERVAL( MONTHS_BETWEEN( t3, t1 ), 'MONTH' );动态创建正确的数据类型:

DECLARE
  t1 TIMESTAMP (2) WITH TIME ZONE :=  to_timestamp_tz('2019-01-21 21:05:53.46 +02:00',
                        'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM');
  t3 TIMESTAMP WITH TIME ZONE := to_timestamp_tz('2020-01-21 21:05:53.46 +02:00',
                        'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM');                       
  ym INTERVAL YEAR(2) to MONTH;   
BEGIN
  ym := NUMTOYMINTERVAL( MONTHS_BETWEEN( t3, t1 ), 'MONTH' );
  DBMS_OUTPUT.PUT_LINE(ym);
END;
/

输出:

+01-00

db<>在这里摆弄


推荐阅读