【问题标题】:Oracle CASE next business dayOracle CASE 下一个工作日
【发布时间】:2019-01-11 22:00:38
【问题描述】:

我想在 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? 中找到了这个,但查询中似乎有错误,我无法解决。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以使用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 
    

    【讨论】:

    • 是否可以进一步简化,不是吗?我也链接的答案中似乎只有 2 个案例,但您的答案中有 3 个。我正在尝试找出原因
    • 有3个案例:周五+3天,周六+2天,其他+1天。
    • 我强烈建议在to_charfunction 中使用 NLS_DATE_LANGUAGE。否则结果取决于客户端 NLS_LANG 设置,这可能不会导致英文日期名称。例如。 TO_CHAR (SYSDATE, 'DAY', 'nls_date_language=AMERICAN')
    【解决方案2】:

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

    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);
    

    【讨论】:

      猜你喜欢
      • 2018-02-16
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多