【发布时间】:2021-02-23 11:26:52
【问题描述】:
我从以下 PL/SQL 查询中得到了不同的结果:
结果:2021-02-01
select
max(b.snapshot_date)
from
ACCOUNT_h b
where
b.snapshot_date < (select max(a.snapshot_date) from ACCOUNT a);
结果:2021-02-19 --> 正确的
select
max(trunc(b.snapshot_date))
from
ACCOUNT_h b
where
b.snapshot_date < (select max(a.snapshot_date) from ACCOUNT a);
account 和 account_h snapshot_date 字段都是 DATE 类型! 可以肯定的是,由于 Sql Developer 显示的日期没有千年和世纪,所以我已经明确了它们。
这是两个表中不同的日期值:
ACCOUNT_H
2021-02-22, 2021-02-19, 2021-02-18, 2021-02-17, 2021-02-16, 2021-02-15, 2021-02- 12, 2021-02-05, 2021-02-01, 2021-01-29, ..., 2020-02-01
帐户
2021-02-22,2021-02-01
如您所见,预期结果是account_h表的max(snapshot_date)小于account表的max(snapshot_date)(即2021-02-22) --> 2021-02-19 (而不是 2021-02-01)。
为什么结果不同而正确的需要 trunc() 函数才能正常工作? 我认为数据有问题,但两个字段的数据类型都是 DATE。
谢谢
我忘记了:表不是表,而是从另一个数据库创建的视图,作为另一个表的分区。 数据库安装在多服务器平台上:Oracle Exadata。 我认为这与我们的目的无关,只是为了给你一个更完整的场景。
【问题讨论】:
-
date在 Oracle 中输入甚至有时间信息。尝试使用使用小时、分钟和秒的格式应用to_char,这样您将看到完整的内容并了解您的行为 -
感谢 Aleksej,但即使考虑到日期的时间部分:2021 年 2 月 19 日总是大于 2021 年 2 月 1 日;你同意吗?
-
你有那些日期列的索引吗?这可能是导致差异的索引损坏(例如,您的第一个查询可能使用索引并获取错误的数据,但第二个查询未使用索引并从表中获取正确的数据)
-
亲爱的 Boneist,这可能是个主意。我已经向我们的数据库管理员提交了一张票。无论如何,为什么 trunc() 不应该使用索引?
-
这是可重现的还是曾经发生过现在有效?如果可重现,请检查两个查询的 执行计划,您应该发现不同...
标签: sql oracle date max sql-order-by