【问题标题】:Oracle - How to calculate if the End Date of an activity is "Nearly Overdue"Oracle - 如何计算活动的结束日期是否“即将过期”
【发布时间】:2015-01-29 15:48:39
【问题描述】:

我有一个包含 START_TIME 和 END_TIME 的 Activity(这两个时间都保存为 Oracle 时间戳

要求: 显示“Nealry Overdue”的活动,其中“Nearly Overdue”的意思是:

查询运行的时间介于End_Date减去持续时间的百分比End_Date。

例如:

1) Start_Time=01/02/2015End_Time=20/02/2015(共 20 天)

2) 被视为几乎过期的活动的配置百分比为 10%

然后:20 天的 10%(开始时间和结束时间之间的持续时间)=2 天

这意味着如果我们在 18/02/201520/02/2015 之间运行查询,则 Activity 应该会导致几乎过期。

知道如何通过查询实现这一目标吗?

【问题讨论】:

  • 你有什么尝试吗?
  • @Wernfried 当然,但我失败了。我不想增加混乱,这就是为什么我没有发布任何我尝试过的查询。
  • 好吧,发一张吧。
  • @Wernfried 我找到了解决方案。

标签: sql database oracle


【解决方案1】:

您可以减去时间戳,并以天为单位获得差异。从那里开始,这只是数学:

SELECT *
FROM   mytable
WEHRE  (CURRENT_TIMESTAMP - end_time) / (end_time - start_time) <= 0.1

【讨论】:

  • 当您减去时间戳时,它会为您提供天数小时:分钟:秒的差异。
  • @Alboz - 您可以将时间戳列转换为日期,因为您不需要精度吗?然后,与 sysdate 相比,您会得到天数的差异。
  • @AlexPoole 我解决了它,但是 Mureinik 提出的建议甚至没有执行(你得到一个错误),因为你不能划分减法的结果。这是因为结果类似于 'Days hours:minutes:seconds'
【解决方案2】:

我不知道是否有用,但由于我设法解决了它,我发布了我的解决方案:

SELECT *  
FROM
    JOB 
WHERE
    TO_TIMESTAMP_TZ ('29/01/2015 16:44 UTC', 'DD/MM/YYYY HH24:mi TZR') <=  JOB.PLANNED_END_DATE
    AND 
   TO_TIMESTAMP_TZ ('29/01/2015 16:44 UTC', 'DD/MM/YYYY HH24:mi TZR') > JOB.PLANNED_END_DATE - ((JOB.PLANNED_END_DATE - JOB.PLANNED_START_DATE)* 0.1);

说明:

0.1 在我的情况下是考虑几乎过期的百分比 (10%)。

TO_TIMESTAMP_TZ ('29/01/2015 16:44 UTC', 'DD/MM/YYYY HH24:mi TZR') 是您想知道活动是否即将过期的目标日期。 通常今天所以你也可以通过CURRENT_TIMESTAMP来代替它

在这种情况下,查询将变为:

SELECT *  
FROM
    JOB 
WHERE
   CURRENT_TIMESTAMP <=  JOB.PLANNED_END_DATE
    AND 
   CURRENT_TIMESTAMP > JOB.PLANNED_END_DATE - ((JOB.PLANNED_END_DATE -    JOB.PLANNED_START_DATE)* 0.1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多