【问题标题】:Using DateDiff() in Oracle在 Oracle 中使用 DateDiff()
【发布时间】:2013-05-05 19:12:05
【问题描述】:

请考虑以下查询。我已经意识到使用fans.checkout-fans.checkin 来计算两个日期之间的差异(以天为单位)并不是一个好主意。如何重写它以便可以使用 DateDiff() 代替?我似乎不能简单地用这个函数替换fans.checkout-fans.checkin

select x.name
from (
    select fans.name,
    dense_rank() over (order by fans.checkout-fans.checkin desc) as rnk
    from fans 
    where fans.checkout-fans.checkin is not null
    ) x
where x.rnk = 1

【问题讨论】:

  • 您可能会发现docs on datetime arithmetic 很有帮助。不确定我是否理解 where 子句在做什么;那只需要where fans.checkout is not null吗?
  • @AlexPoole 是的,你是对的,应该是 where fans.checkout is not null

标签: sql oracle date-arithmetic


【解决方案1】:

为什么您认为将两个日期相减以获得它们之间的天数不是一个好主意?这当然是在 Oracle 中进行这种日期算术的标准方法。

DateDiff 不是 Oracle 中存在的函数。我知道它存在于 SQL Server 中。当然,您可以编写自己的函数并调用它

CREATE OR REPLACE FUNCTION dateDiff( p_dt1 IN DATE,
                                     p_dt2 IN DATE )
  RETURN NUMBER
IS
BEGIN
  RETURN p_dt1 - p_dt2;
END;

不过,这样做比简单地继续减去两个日期有什么好处并不明显。

【讨论】:

  • 我正在使用一个非常小的数据集,其中所有日期相隔几天并且在同一个月,因此它目前正在产生正确的结果。我的想法是,如果日期在不同的月份/年份,那么简单地减去两个日期就不再适用了。如果不是这种情况,那么我将保持原样,无需创建函数。感谢您的洞察力。
  • @Tangler - 无论两个日期相距多远,减去两个日期都有效。显然,您必须考虑如何正确解释该数据(即,仅仅因为两个日期相隔 365 天并不意味着它们相隔 1 年)。如果范围很大,人类可能更喜欢查看两个日期之间的月数 (months_between),而不是试图弄清楚 91 天是否为 3 个月,或者不试图记住哪些月份有 31 天。
  • 另一个缺点是您将上下文从 SQL 引擎切换到 PL/SQL 引擎,这会产生成本。几行不明显,但数万行非常明显。
【解决方案2】:

试试这个:

    NUMTODSINTERVAL(SYSDATE - @OLD_DT  , 'DAY')

    OR

    TRUNC (SYSDATE) - @OLD_DT 

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 2020-09-23
    • 2015-04-08
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多