Oracle CASE下一工作日

tvokkenx  于 2023-05-16  发布在  Oracle
关注(0)|答案(3)|浏览(203)

我想在Oracle查询中计算下一个工作日。所以在星期一-星期四应该是sysdate+1,星期五应该是sysdate+3,星期六应该是sysdate+2,星期天应该是sysdate+1
我想动态地做它,而不是有很多覆盖不同日子的where语句。

where order_date = CASE WHEN (1 + TRUNC (SYSDATE) - TRUNC (SYSDATE, 'IW')) < 5 
  THEN TRUNC (SYSDATE) + 1 
  ELSE TRUNC (SYSDATE + 4), 'IW')  
END

我从答案Next business day (Monday - Friday) in Oracle?中找到了这个,但似乎是查询错误,我无法解决。

zvms9eto

zvms9eto1#

你可以使用to_char(sysdate, 'fmday')来返回当天的字符串名称:

where order_date =  
  case
    when to_char(sysdate, 'fmday', 'nls_date_language=AMERICAN') = 'friday' then trunc(sysdate) + 3
    when to_char(sysdate, 'fmday', 'nls_date_language=AMERICAN') = 'saturday' then trunc(sysdate) + 2
    else trunc(sysdate) + 1
  end

更好:

where order_date = 
  trunc(sysdate) + case
    when to_char(sysdate, 'fmday', 'nls_date_language=AMERICAN') = 'friday' then 3
    when to_char(sysdate, 'fmday', 'nls_date_language=AMERICAN') = 'saturday' then 2
    else 1
  end
eagi6jfj

eagi6jfj2#

要从语句中获得结果,请使用以下语句。

where order_date = 
(Select 
CASE WHEN (1 + TRUNC (SYSDATE) - TRUNC (SYSDATE, 'IW')) < 5 
  THEN TRUNC (SYSDATE) + 1 
  ELSE TRUNC ((SYSDATE + 4), 'IW')  
END from dual);
yqhsw0fo

yqhsw0fo3#

您可以用途:

WHERE order_date = TRUNC(SYSDATE)
                   + CASE TRUNC(SYSDATE) - TRUNC (SYSDATE, 'IW')
                     WHEN 4 THEN 3 -- Add 3 days on Friday
                     WHEN 5 THEN 2 -- Add 2 days on Saturday
                            ELSE 1 -- Add 1 day on all other days of the week
                     END

相关问题