Sql 确定sysdate之前的星期五(或其他特定工作日)

Sql 确定sysdate之前的星期五(或其他特定工作日),sql,oracle,Sql,Oracle,我需要返回系统日期之前的最后一个星期五的日期 要明确的是: 如果我在9月29日星期四运行脚本,我希望上周五的日期在9月22日星期五返回。 如果我在两天后运行脚本,10月1日星期六,我希望明天的日期在9月30日星期五返回。 Oracle有一个名为next_day see的方便函数,它执行一些相关的操作。它在给定日期后的一周的第二天返回。您可以使用此选项获得所需的: select next_day(trunc(sysdate), 'FRIDAY') - 7 from dual; 注意:如果今天是星

我需要返回系统日期之前的最后一个星期五的日期

要明确的是:

如果我在9月29日星期四运行脚本,我希望上周五的日期在9月22日星期五返回。 如果我在两天后运行脚本,10月1日星期六,我希望明天的日期在9月30日星期五返回。
Oracle有一个名为next_day see的方便函数,它执行一些相关的操作。它在给定日期后的一周的第二天返回。您可以使用此选项获得所需的:

select next_day(trunc(sysdate), 'FRIDAY') - 7
from dual;

注意:如果今天是星期五,则返回今天的日期。我不确定这是否是你的意图。如果您想要上一个星期五,请使用sysdate-1。

为了完整起见,这里有一种与NLS设置无关的方法:

WITH dates AS (SELECT TRUNC(SYSDATE, 'mm') + LEVEL -1 dt
               FROM   dual
               CONNECT BY LEVEL <= 22)
SELECT dt,
       to_char(dt, 'fmDay') day_of_dt,
       TRUNC(dt + 3, 'iw') - 3  prev_fri_incl_today,
       TRUNC(dt + 2, 'iw') - 3  prev_fri_not_incl_today
FROM   dates;

DT          DAY_OF_DT PREV_FRI_INCL_TODAY PREV_FRI_NOT_INCL_TODAY
----------- --------- ------------------- -----------------------
01/09/2016  Thursday  26/08/2016          26/08/2016
02/09/2016  Friday    02/09/2016          26/08/2016
03/09/2016  Saturday  02/09/2016          02/09/2016
04/09/2016  Sunday    02/09/2016          02/09/2016
05/09/2016  Monday    02/09/2016          02/09/2016
06/09/2016  Tuesday   02/09/2016          02/09/2016
07/09/2016  Wednesday 02/09/2016          02/09/2016
08/09/2016  Thursday  02/09/2016          02/09/2016
09/09/2016  Friday    09/09/2016          02/09/2016
10/09/2016  Saturday  09/09/2016          09/09/2016
11/09/2016  Sunday    09/09/2016          09/09/2016
12/09/2016  Monday    09/09/2016          09/09/2016
13/09/2016  Tuesday   09/09/2016          09/09/2016
14/09/2016  Wednesday 09/09/2016          09/09/2016
15/09/2016  Thursday  09/09/2016          09/09/2016
16/09/2016  Friday    16/09/2016          09/09/2016
17/09/2016  Saturday  16/09/2016          16/09/2016
18/09/2016  Sunday    16/09/2016          16/09/2016
19/09/2016  Monday    16/09/2016          16/09/2016
20/09/2016  Tuesday   16/09/2016          16/09/2016
21/09/2016  Wednesday 16/09/2016          16/09/2016
22/09/2016  Thursday  16/09/2016          16/09/2016
并证明我的解决方案仍然有效:

SQL> WITH dates AS (SELECT TRUNC(SYSDATE, 'mm') + LEVEL -1 dt
  2                 FROM   dual
  3                 CONNECT BY LEVEL <= 22)
  4  SELECT dt,
  5         to_char(dt, 'fmDay') day_of_dt,
  6         TRUNC(dt + 3, 'iw') - 3  prev_fri_incl_today,
  7         TRUNC(dt + 2, 'iw') - 3  prev_fri_not_incl_today
  8  FROM   dates
  9  ;
DT          DAY_OF_DT PREV_FRI_INCL_TODAY PREV_FRI_NOT_INCL_TODAY
----------- --------- ------------------- -----------------------
01/09/2016  Jeudi     26/08/2016          26/08/2016
02/09/2016  Vendredi  02/09/2016          26/08/2016
03/09/2016  Samedi    02/09/2016          02/09/2016
04/09/2016  Dimanche  02/09/2016          02/09/2016
05/09/2016  Lundi     02/09/2016          02/09/2016
06/09/2016  Mardi     02/09/2016          02/09/2016
07/09/2016  Mercredi  02/09/2016          02/09/2016
08/09/2016  Jeudi     02/09/2016          02/09/2016
09/09/2016  Vendredi  09/09/2016          02/09/2016
10/09/2016  Samedi    09/09/2016          09/09/2016
11/09/2016  Dimanche  09/09/2016          09/09/2016
12/09/2016  Lundi     09/09/2016          09/09/2016
13/09/2016  Mardi     09/09/2016          09/09/2016
14/09/2016  Mercredi  09/09/2016          09/09/2016
15/09/2016  Jeudi     09/09/2016          09/09/2016
16/09/2016  Vendredi  16/09/2016          09/09/2016
17/09/2016  Samedi    16/09/2016          16/09/2016
18/09/2016  Dimanche  16/09/2016          16/09/2016
19/09/2016  Lundi     16/09/2016          16/09/2016
20/09/2016  Mardi     16/09/2016          16/09/2016
21/09/2016  Mercredi  16/09/2016          16/09/2016
22/09/2016  Jeudi     16/09/2016          16/09/2016

22 rows selected

谢谢戈登,这是一个非常简单的问题解决方案。感谢您对“今天的日期”是星期五的情景的澄清。
SQL> WITH dates AS (SELECT TRUNC(SYSDATE, 'mm') + LEVEL -1 dt
  2                 FROM   dual
  3                 CONNECT BY LEVEL <= 22)
  4  SELECT dt,
  5         to_char(dt, 'fmDay') day_of_dt,
  6         TRUNC(dt + 3, 'iw') - 3  prev_fri_incl_today,
  7         TRUNC(dt + 2, 'iw') - 3  prev_fri_not_incl_today
  8  FROM   dates
  9  ;
DT          DAY_OF_DT PREV_FRI_INCL_TODAY PREV_FRI_NOT_INCL_TODAY
----------- --------- ------------------- -----------------------
01/09/2016  Jeudi     26/08/2016          26/08/2016
02/09/2016  Vendredi  02/09/2016          26/08/2016
03/09/2016  Samedi    02/09/2016          02/09/2016
04/09/2016  Dimanche  02/09/2016          02/09/2016
05/09/2016  Lundi     02/09/2016          02/09/2016
06/09/2016  Mardi     02/09/2016          02/09/2016
07/09/2016  Mercredi  02/09/2016          02/09/2016
08/09/2016  Jeudi     02/09/2016          02/09/2016
09/09/2016  Vendredi  09/09/2016          02/09/2016
10/09/2016  Samedi    09/09/2016          09/09/2016
11/09/2016  Dimanche  09/09/2016          09/09/2016
12/09/2016  Lundi     09/09/2016          09/09/2016
13/09/2016  Mardi     09/09/2016          09/09/2016
14/09/2016  Mercredi  09/09/2016          09/09/2016
15/09/2016  Jeudi     09/09/2016          09/09/2016
16/09/2016  Vendredi  16/09/2016          09/09/2016
17/09/2016  Samedi    16/09/2016          16/09/2016
18/09/2016  Dimanche  16/09/2016          16/09/2016
19/09/2016  Lundi     16/09/2016          16/09/2016
20/09/2016  Mardi     16/09/2016          16/09/2016
21/09/2016  Mercredi  16/09/2016          16/09/2016
22/09/2016  Jeudi     16/09/2016          16/09/2016

22 rows selected