gpt4 book ai didi

Oracle 将天到秒的间隔与整数进行比较

转载 作者:行者123 更新时间:2023-12-01 03:09:57 26 4
gpt4 key购买 nike

我想知道当我尝试将一天到第二个间隔与整数进行比较时,oracle 引擎盖下发生了什么。

下面举例。

SET SERVEROUTPUT ON;
DECLARE
v_date1 TIMESTAMP := current_timestamp ;
v_date2 TIMESTAMP := current_timestamp - 150;
BEGIN
-- Wrong way. But what is happening here?
IF v_date1 - v_date2 < 2 THEN
DBMS_OUTPUT.PUT_LINE('YES - why?');
ELSE
DBMS_OUTPUT.PUT_LINE('NO');
END IF;
-- Correct way
IF v_date1 < v_date2 + 2 THEN
DBMS_OUTPUT.PUT_LINE('YES');
ELSE
DBMS_OUTPUT.PUT_LINE('NO - works as expected');
END IF;
-- Another correct way
IF v_date1 - v_date2 < INTERVAL '2' DAY THEN
DBMS_OUTPUT.PUT_LINE('YES');
ELSE
DBMS_OUTPUT.PUT_LINE('NO - works as expected as well');
END IF;
END;

有人可以向我解释为什么第一个 IF 被评估为 true 吗?

最佳答案

您所看到的似乎是一个错误,或者至少是未记录的行为。所以不幸的是,我认为您需要向 Oracle 提出服务请求以获得解释。只有他们可以窥探引擎盖下的情况,看看它是否在做他们期望的事情,或者是他们没有想到的事情。

分解一些步骤,而不仅仅是针对您的具体问题:

v_date1 TIMESTAMP := current_timestamp ;

铸件 current_timestamp ,这是您的 session 时区中的时间,到一个简单的时间戳 - 丢失时区信息。
v_date2 TIMESTAMP := current_timestamp - 150;

有两个步骤; current_timestamp - 150给你一个日期,丢失小数秒和时区信息,然后将其转换回时间戳。最好用 - interval '150' day ,但我意识到您只是在这里设置了一些虚拟数据。
IF v_date1 - v_date2 < 2 THEN

也是多个阶段: v_date1 - v_date2给你一个间隔,例如 +150 00:00:00.975444 . (请注意,这不完全是 150 天,部分原因是两次 current_dtimestamp 调用之间耗时很短,但比您对这种差异的预期要大得多 - 因为早期反弹通过日期数据类型。)

然后比较本身就是有趣的地方。看起来隐式数据转换正在发生,但您正在尝试将间隔与数字进行比较,并且没有允许这样做的隐式转换;并在尝试执行相同比较错误的纯 SQL 中:
select case when current_timestamp - (current_timestamp - 150) < 2 then 'yes' else 'no' end from dual;

ORA-00932: inconsistent datatypes: expected INTERVAL DAY TO SECOND got NUMBER

所以看起来 PL/SQL 正在做一些其他的隐式转换,但不清楚是什么,而且似乎没有在 MoS 上记录或提及。它似乎不是字符串比较,也不是原始的,也不是将 2 转换为间隔类型,也不是将间隔转换为数字,也不是将计算中的间隔或时间戳转换为日期...

似乎没有任何数值使该比较返回 false - 无论左侧是计算(可能会被重写为更像您的第二个版本的东西)还是固定间隔变量。这使它看起来更像是一个错误而不是故意的。

原始代码中的最后一件事:
-- Correct way
IF v_date1 < v_date2 + 2 THEN

这也不太正确,尽管它可能看起来很挑剔; v_date + 2为您提供日期而不是时间戳,因此如果您之前还没有丢失小数秒精度(使用 - 150),那么此时您会丢失。现在您将时间戳与日期进行比较,这涉及更多隐式转换。您可以将数字 2 更改为 2 天间隔,但这在逻辑上与您的最终(正确)比较相同。

关于Oracle 将天到秒的间隔与整数进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52990611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com