【问题标题】:count business days in calculation在计算中计算工作日
【发布时间】:2022-01-17 07:15:17
【问题描述】:

继续我之前的问题:case when date column is greater than sysdate then 'Y'

我忘记考虑的一件事是在计算中包括工作日。

这里是查询:

select
 v.voyage "Voyage"
 ,v.service "Service"
 ,to_char(vp.eta_date, 'MONTH dd, yyyy') "ETA"
 ,case 
   when v.service = 'USA' then to_char(vp.eta_date - 2, 'MONTH dd, yyyy')
   else 'n/a'
   end as "Notice"
 ,case 
   CASE WHEN v.service = 'USA' AND vp.eta_date - 2 > sysdate THEN 'Y' 
   ELSE 'N'
   end as "Sent"
from 
 table  

所以我需要在上面的计算中排除周六和周日。

我尝试在 where 子句中添加这个:

to_char(vp.eta_date, 'DY') NOT IN ('SAT', 'SUN')

但计算似乎不起作用。

如果我采用 vp.eta_date - 5,例如,我将使用 2021 年 12 月 22 日。我应该得到以下日期:

December 16th

但我要到 12 月 17 日。

这当然让我相信我尝试过的方法不起作用。

我该如何解决这个问题?

【问题讨论】:

  • 将它添加到 where 子句如何更改日期减法?
  • @OldProgrammer - 这是有道理的。

标签: sql oracle


【解决方案1】:

您可以将日期与 ISO 周开始时的日期进行比较,然后根据星期几增加天数:

CASE
WHEN v.service   = 'USA'
AND  vp.eta_date - CASE TRUNC(vp.eta_date) - TRUNC(vp.eta_date, 'IW')
                   WHEN 0 THEN 4 -- Monday
                   WHEN 1 THEN 4 -- Tuesday
                   WHEN 2 THEN 2 -- Wednesday
                   WHEN 3 THEN 2 -- Thursday
                   WHEN 4 THEN 2 -- Friday
                   WHEN 5 THEN 2 -- Saturday
                   WHEN 6 THEN 3 -- Sunday
                   END
     > SYSDATE
THEN 'Y' 
ELSE 'N'
END as "Sent"

【讨论】:

  • 非常感谢您的帮助。我将如何处理它:when v.service = 'USA' then to_char(vp.eta_date - 2, 'MONTH dd, yyyy')
  • 只需将2 替换为CASE 表达式即可。
  • 我有另一个案例是 5 而不是 2。所以它看起来像这样:当 v.service = 'USA' then to_char(vp.eta_date - 5, 'MONTH dd, yyyy')想法?
  • 如果减去 5 个工作日,那么在这个范围内总会有两个周末,所以只需减去总共 7 天。
  • 当我看到你的评论时,我正在努力。非常感谢你的帮助。接受你的回答。
猜你喜欢
  • 2010-09-25
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 2017-03-08
相关资源
最近更新 更多