Oracle 无法获取年-月间隔

Oracle 无法获取年-月间隔,oracle,plsql,Oracle,Plsql,我正在学习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('202

我正在学习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:
我真的很困惑为什么会发生这种情况,我试图改变一年的精度,但那没有帮助

如果ym的数据类型为INTERVAL DAY2到SECOND2,则得到正确的结果。如果我将ym替换为ym:='10-2';它也起作用。但对于ym INTERVAL YEAR2 to MONTH,它不起作用:

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

相反,您可以在t3、t1和“月”之间使用numtoymenterval MONTHS_;要动态创建正确的数据类型,请执行以下操作:

声明 t1时间戳2,带时区:=至时间戳2019-01-21 21:05:53.46+02:00, ‘YYYY-MM-DD HH24:MI:SS.FF TZH:TZM’; 带时区的t3时间戳:=至时间戳'2020-01-21 21:05:53.46+02:00', ‘YYYY-MM-DD HH24:MI:SS.FF TZH:TZM’; ym间隔1年至2月; 开始 ym:=t3、t1和“月”之间的几个月; DBMS_OUTPUT.PUT_LINEym; 终止 / 产出:

DBFIDLE

t3-t1不起作用,因为结果值是间隔日到秒的数据类型,并且没有隐式转换到间隔年到月

相反,您可以在t3、t1和“月”之间使用numtoymenterval MONTHS_;要动态创建正确的数据类型,请执行以下操作:

声明 t1时间戳2,带时区:=至时间戳2019-01-21 21:05:53.46+02:00, ‘YYYY-MM-DD HH24:MI:SS.FF TZH:TZM’; 带时区的t3时间戳:=至时间戳'2020-01-21 21:05:53.46+02:00', ‘YYYY-MM-DD HH24:MI:SS.FF TZH:TZM’; ym间隔1年至2月; 开始 ym:=t3、t1和“月”之间的几个月; DBMS_OUTPUT.PUT_LINEym; 终止 / 产出:

dbfiddle

我在中发现可以使用以下语法:

ym := (t3-t1) year to month;
我在中发现您可以使用以下语法:

ym := (t3-t1) year to month;

要使ym:=t3-t1起作用,t3的正确值是多少?或者你能给我举一个例子,你减去两个时间戳,得到的结果是从第二年到第二个月的格式吗?我不明白为什么结果是从一天到一秒,而不是从一年到一个月。仅说明TIMESTAMP-TIMESTAMP=时间间隔,但不区分时间间隔日到秒和时间间隔年到月。似乎是Oracle做出的设计决策。显然,它默认为DAY to second t3的正确值是多少,以使ym:=t3-t1正常工作?或者你能给我举一个例子,你减去两个时间戳,得到的结果是从第二年到第二个月的格式吗?我不明白为什么结果是从一天到一秒,而不是从一年到一个月。仅说明TIMESTAMP-TIMESTAMP=时间间隔,但不区分时间间隔日到秒和时间间隔年到月。这似乎是Oracle做出的设计决策。显然,它默认为从一天到另一天。您能解释一下从一年到一月的添加是什么吗?它与由于空格DECLARE ds INTERVAL DAY2到SECOND2而省略的额外代码有何不同;开始ds:=t3-t1;DBMS_OUTPUT.PUT_LINEds;结束@Kay t3-t1默认隐式生成一天到第二天的间隔。t3-t1年到月显式生成年到月的间隔,t3-t1日到秒显式生成日到秒的间隔。在Oracle文档中很难找到这种行为,但它在中。我使用dump检查返回值,t3-t1返回190个间隔日到秒,t3-t1年到月返回189个间隔年到月,因此它的工作方式类似于间隔类型的转换。我从来没有使用过这种语法,也从来没有需要过它,它对我来说也是新的,但这正是你所要求的。你能解释一下年复一年的作用吗?它与由于空格DECLARE ds INTERVAL DAY2到SECOND2而省略的额外代码有何不同;开始ds:=t3-t1;DBMS_OUTPUT.PUT_LINEds;结束@Kay t3-t1默认隐式生成一天到第二天的间隔。t3-t1年到月显式生成年到月的间隔,t3-t1日到秒显式生成日到秒的间隔。在Oracle文档中很难找到这种行为,但它在中。我使用dump检查返回值,t3-t1返回190个间隔日到秒,t3-t1年到月返回189个间隔年到月,因此它的工作方式类似于间隔类型的转换。我从未使用过这种语法,也从未需要过它,它对我来说也是新的,但它正是你所要求的。