【问题标题】:before a date in Oracle SQL在 Oracle SQL 中的日期之前
【发布时间】:2025-12-19 06:15:15
【问题描述】:

给出一个日期,例如(2013 年 5 月 11 日,即星期六)。我必须在此日期之前找到 7 个工作日(周一至周五)。那是 2013 年 5 月 3 日,即星期五。我知道如何找出两个日期之间的工作日。作者:-

SELECT from_date- todate - ((
          TRUNC (NEXT_DAY (from_date, 'SAT') - NEXT_DAY (todate - 1, 'SAT')) / 7) + (
          TRUNC (NEXT_DAY (from_date, 'SUN') - NEXT_DAY (todate - 1, 'SUN')) / 7)) + 1
FROM   dual;

但是现在我只有一个给定的日期,并且必须找到这一天之前的第 7 天(根据工作日!)

【问题讨论】:

  • 请定义“工作日”。谢谢。
  • 工作日表示周一至周五............已编辑
  • 所以星期一出现的假期被认为是工作日。
  • @EvilTeach 在任何其他情况下你需要有一个预定义的假期表,OP 没有提到它的存在;)
  • 是的 :) 在假期工作并不是什么新鲜事

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:

sysdate 替换为您需要的任何日期。

02:35:58 SYSTEM@sandbox> ed
Wrote file S:\spool\sandbox\BUFFER_SYSTEM_36.sql

  1  select sysdate - 7 seven_days_ago, min(sysdate - level) seven_bdays_ago
  2    from dual
  3   where rownum <= 7
  4     and to_char(sysdate - level, 'DY') not in ('SAT', 'SUN')
  5* connect by level <= 11
02:36:16 SYSTEM@sandbox> /

SEVEN_DAYS_AGO      SEVEN_BDAYS_AGO
------------------- -------------------
04.05.2013 02:36:17 02.05.2013 02:36:17

Elapsed: 00:00:00.03

【讨论】:

  • 你不能connect by level &lt;= 9吗?它删除了大量不必要的递归查询......
  • @Ben 确实有道理。出于某种原因(可能是凌晨 2 点),我最初认为 rownum
  • 什么是水平?我正在使用 PL/SQL,但我不知道什么级别的?你能帮忙吗?
  • @SonamKapoor level 是 oracle sql 中的伪列,用于显示分层查询中当前行的深度 (docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm)。在这个示例中实际上没有层次结构,使用按级别/行号连接是从无到有生成数据集的常用技巧
  • Nitpick:to_char(..,'DY') 返回一个特定于语言环境的字符串,因此如果您需要支持不同的语言环境,您还应该为 to_char() 提供 NLS 设置。
【解决方案2】:
SELECT * FROM
 (
  SELECT (trunc(SYSDATE)-2)                      start_dt -- May 11 --
       , (trunc(SYSDATE)-2)-LEVEL                bus_days -- All bus days before May 11 --
       , to_char((trunc(SYSDATE)-2)-LEVEL, 'DY') wk_day
   FROM DUAL
  CONNECT BY LEVEL <= (trunc(SYSDATE)-2)-((trunc(SYSDATE)-2) - 7) -- May 11-7 days ago=May 4
 )
WHERE wk_day NOT IN ('SAT', 'SUN')
ORDER BY bus_days
/

START_DT    BUS_DAYS    WK_DAY
--------------------------------
5/11/2013    5/6/2013    MON
5/11/2013    5/7/2013    TUE
5/11/2013    5/8/2013    WED
5/11/2013    5/9/2013    THU
5/11/2013    5/10/2013   FRI

【讨论】: