oracle - 无法获得年月间隔
问题描述
我正在学习 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
它不起作用:(
解决方案
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<>在这里摆弄
推荐阅读
- android - 如何冻结活动顶部的工具栏?
- python - 如何使用代码导入修复 3.7.2 的 pycharm 安装
- ajax - 如何在 Ajax 中获取(处理)错误(不可接受和内部服务器错误)异常内容
- ios - 长按时像 iMessage 一样突出显示 UITableViewCell
- xpath - 如何为android appium使用索引查找元素
- c# - 如何使用 Lotus c# (.Net) 打开新邮件
- scala - 使用 JSoup 清理 Scala Spark DataFrame
- tmux - 如何从命令行创建多个包含窗口的 tmux 会话
- r - 计算 R 中超过阈值的最大持续时间(时间序列)
- c# - 未找到或丢失文件