【问题标题】:Filtering by difference in dates in where SQL Oracle在 SQL Oracle 中按日期差异过滤
【发布时间】:2017-09-12 15:32:22
【问题描述】:

我有一个脚本,它从许多不同的表中收集数据并返回所有结果,该脚本不是我编写的,并且有 1000 多行代码。为了简化:

SELECT 
       date_of_opening,
       ...<many other columns>
FROM
       <some other sub queries>;

由于它返回整组数据,我想限制它,仅限于那些在 30 天内打开的数据,我尝试过:

SELECT *
FROM 
      (SELECT 
              date_of_opening,
              ...<many other columns>
       FROM
              <some other sub queries>)
WHERE date_of_opening - to_date('23.01.2011','dd.mm.yyyy') BETWEEN (-30) and (-1) ;

导致

ORA-00932:不一致的数据类型:预期的 CHAR 得到了 DATE。

但是,如果我在 select 中尝试相同的查询,它会将差异显示为正确的:

SELECT 
       date_of_opening,
       date_of_opening - to_date('23.01.2011','dd.mm.yyyy') as difference,
       ...<many other columns>
FROM
       <some other sub queries>;

假设例如 date_of_opening 是 31.12.2010 差异将是 -23

我也尝试过先计算差异,然后在where difference between (-30) and (-1) 中过滤它,但得到了

ORA-00932:不一致的数据类型:预期 NUMBER 得到 DATE

past_of_opening 的数据类型是日期

我可以使用什么方法来过滤结果,或者这种行为的原因是什么?

【问题讨论】:

  • 是否有可能date_of_opening 在您未向我们显示的查询部分被转换为不同的类型?因为您的查询应该可以工作:dbfiddle.uk/…
  • @a_horse_with_no_name 我没有在查询中看到强制转换操作。同样在选择中我尝试计算差异,它实际上成功了,我也尝试过to_number(difference) &gt; (-30),这根本没有帮助
  • 您看过我链接中的示例了吗?您向我们展示的条件有效。您向我们展示的查询部分中一定有某些内容破坏了这一点。
  • @a_horse_with_no_name 是的,我访问了链接,我之前也尝试过,但是我真的在date_of_opening 上找不到任何演员,开始怀疑自己是否错过了什么,但重新检查了现在两次仍然看不到对date_of_opening的任何操纵
  • 正如我所说:您没有向我们展示的部分中一定有一些东西破坏了这一点。可能是您不知道的 implicit 演员表。但是由于您选择不向我们展示完整的代码,因此无法回答。

标签: sql oracle where


【解决方案1】:

30 天的期限可能是:

WHERE date_of_opening  BETWEEN (to_date('23.01.2011','dd.mm.yyyy')-30) and (to_date('23.01.2011','dd.mm.yyyy')) 

假设 date_of_opening 确实是一个 DATE。

【讨论】:

  • 工作正常,谢谢。知道我的方法有什么问题吗?
  • 不确定,但我认为这种方式可读性更好,如果可用,可以使用 date_of_opening 索引。
猜你喜欢
  • 2021-09-04
  • 2015-11-26
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2021-11-23
  • 1970-01-01
  • 2015-02-02
相关资源
最近更新 更多