在一个月内找到星期三(或其他工作日)的数量 - Oracle SQL



我找到了一个查询一个月内的周日数量。我一直在修补它,但不知道如何更改它以获取一个月内的星期三数量。你能告诉我如何吗?

    with 
months as (
        select add_months(trunc(sysdate,'YEAR'),level-13) month
        from dual
    connect by level <= 36
  )
select to_char(month,'YYYY') year,
       to_char(month,'Month') month,
       to_char(month,'Day') first_day,
      to_char(last_day(month),'Day DD') last_day,
      4+
      case 
        when to_char(last_day(month),'DD') - decode(to_char(month,'D'),1,0,8 -to_char(month,'D')) >= 29
          then 1
        else 0
      end nb_sunday
   from months

这是游戏:您给我一年(如2015年)和一周中的一天,以三个字母的字符串的形式(例如'wed')。我将与该年的每个月一起退还一张桌子,并以每月的投入等于您的投入。

在这里简单地实施我对MT0答案的建议。我正在努力编码年度和周的星期(在CTE中),因为"如何将参数传递给查询"(通过绑定变量等)不是此线程中的焦点。

with 
     inputs ( yr, day_of_week ) as (
       select 2015, 'Wed' from dual
     ),
     prep ( dec31 ) as (
       select to_date(to_char(yr - 1) || '-12-31', 'yyyy-mm-dd') from inputs
     )
select     to_char(add_months(dec31, level), 'Mon-yyyy')               as mth,
           ( next_day(add_months(dec31, level)    , day_of_week) -
             next_day(add_months(dec31, level - 1), day_of_week) ) / 7 as cnt
from       inputs cross join prep
connect by level <= 12;
MTH       CNT
-------- ----
Jan-2015    4
Feb-2015    4
Mar-2015    4
Apr-2015    5
May-2015    4
Jun-2015    4
Jul-2015    5
Aug-2015    4
Sep-2015    5
Oct-2015    4
Nov-2015    4
Dec-2015    5
12 rows selected.

本月的最后一个星期三由:

给出
TRUNC( NEXT_DAY( LAST_DAY( :month ) - INTERVAL '7' DAY, 'WEDNESDAY' ) )

本月的第一个星期三由以下方式提供:

NEXT_DAY( TRUNC( :month, 'MM' ) - INTERVAL '1' DAY, 'WEDNESDAY' )

减去它们之间的天数。除以7并添加1,您会得到周三的数量:

SELECT ( TRUNC( NEXT_DAY( LAST_DAY( :month ) - INTERVAL '7' DAY, 'WEDNESDAY' ) )
       - NEXT_DAY( TRUNC( :month, 'MM' ) - INTERVAL '1' DAY, 'WEDNESDAY' )
       ) / 7 + 1
       AS number_of_wednesdays
FROM   DUAL;

,您只需使用@mathguy建议的一个月的第一个星期三和下个月的下个月之间的区别

SELECT ( NEXT_DAY(
           ADD_MONTHS( TRUNC( :month, 'MM' ), 1 ) - INTERVAL '1' DAY,
           'WEDNESDAY'
         )
       - NEXT_DAY(
           TRUNC( :month, 'MM' ) - INTERVAL '1' DAY,
           'WEDNESDAY'
         )
       ) / 7
       AS number_of_wednesdays
FROM   DUAL;

最新更新