【问题标题】:Oracle max(date) shows different resultsOracle max(date) 显示不同的结果
【发布时间】: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);

accountaccount_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


【解决方案1】:

我已经检查了两个查询,它返回了相同的结果 19-Feb-21。请再次检查数据。只需尝试 select * from Accountselect * from account_H 我已经使用您的示例创建了数据,并从两个查询中获得了您想要的结果。看看吧:

create table Account_H(snapshot_date date);
insert into Account_H values(date'2021-02-22');
insert into Account_H values(date'2021-02-19');
insert into Account_H values(date'2021-02-18');
insert into Account_H values(date'2021-02-17');
insert into Account_H values(date'2021-02-16');
insert into Account_H values(date'2021-02-15');
insert into Account_H values(date'2021-02-12');
insert into Account_H values(date'2021-02-05');
insert into Account_H values(date'2021-02-01');


create table Account(snapshot_date date);
insert into Account values(date'2021-02-22');
insert into Account values(date'2021-02-01');

select
  max(b.snapshot_date)
from
  ACCOUNT_h b
where
  b.snapshot_date < (select max(a.snapshot_date) from ACCOUNT a);
  
  select
  max(trunc(b.snapshot_date))
from
  ACCOUNT_h b
where
  b.snapshot_date < (select max(a.snapshot_date) from ACCOUNT a);

输出:

【讨论】:

  • 亲爱的 Kazi Mohammad Ali Nur,我已经尝试使用我自己的表为这个目标创建(就像你所做的那样)以及数据库中具有相同结构的其他表。结果是正确的,除了 account 和 account_h 表。太奇怪了!
  • 请您尝试 select * from Account order by snapshot_date 和 select * from account_H order by snapshot_date 来确定日期是如何排序的。
  • 亲爱的 Kazi Mohammad Ali Nur,我已经这样做了,并在我的帖子中报告了日期,请阅读上文。问候
  • 现在它变得陌生了。如果顺序没问题, max() 应该从有序列表中选择第一个。
猜你喜欢
  • 1970-01-01
  • 2015-12-02
  • 2016-01-12
  • 1970-01-01
  • 2021-06-16
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
相关资源
最近更新 更多