Oracle 无法获取年-月间隔
我正在学习PL-SQL,练习是找出两个日期之间的年-月间隔差。我编写了以下代码: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
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;
终止
/
产出:
DBFIDLEt3-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个间隔年到月,因此它的工作方式类似于间隔类型的转换。我从未使用过这种语法,也从未需要过它,它对我来说也是新的,但它正是你所要求的。