两个日期之间的星期五数量

时间:2011-02-11 10:13:44

标签: sql oracle select date

如何使用oracle sql中的select语句找到两个日期之间的周五数(包括两个日期)?

7 个答案:

答案 0 :(得分:12)

这样做:

select ((next_day(date2-7,'FRI')-next_day(date-1,'FRI'))/7)+1 as num_fridays
from data

如果我打破它,也许是最好的。 NEXT_DAY函数返回第二天(在这种情况下是星期五) 日期之后。

所以在d1之后找到第一个星期五:

next_day( d1, 'FRI')

但如果d1是星期五将在下周五返回,那么我们调整:

next_day( d1-1, 'FRI')

类似于查找上一个星期五,包括d2,我们这样做:

next_day( d1-7, 'FRI')

减去2会给出一些天数:如果它们是相同的日期则为0,如果它们相隔一周则为7,依此类推:

next_day( d1-7, 'FRI') - next_day( d1-1, 'FRI') 

转换为周:

(next_day( d1-7, 'FRI') - next_day( d1-1, 'FRI')) / 7

最后,如果它们是相同的日期我们得到0,但实际上有1个星期五,依此类推,所以我们添加一个:

((next_day( d1-7, 'FRI') - next_day( d1-1, 'FRI')) / 7) + 1

答案 1 :(得分:6)

我必须投入两分钱才能使用日历表。 (这是一种强迫。)

select count(*) as num_fridays
from calendar
where day_of_week = 'Fri'
  and cal_date between '2011-01-01' and '2011-02-17';

num_fridays
-----------
6

死得易懂。利用索引。

也许我应该开始一个12人组。日历表匿名。

答案 2 :(得分:2)

请参阅:

Why should I consider using an auxiliary calendar table?

本文的代码专门针对SQL Server,但这些技术可以移植到大多数SQL平台上。

使用日历表,您的查询可以像

一样简单
SELECT COUNT(*) AS friday_tally
  FROM YourTable AS T1
       INNER JOIN Calendar AS C1
          ON C1.dt BETWEEN T1.start_date AND T1.end_date
 WHERE C1.day_name = 'Friday'; -- could be a numeric code

答案 3 :(得分:1)

select sum(case when trim(to_char(to_date('2009-01-01','YYYY-MM-DD')+rownum,'Day')) = 'Friday' then 1 else 0 end) number_of_fridays
from dual
connect by level <= to_date('&end_date','YYYY-MM-DD') - to_date('&start_date','YYYY-MM-DD')+1;

原始来源 - http://forums.oracle.com/forums/thread.jspa?messageID=3987357&tstart=0

答案 4 :(得分:0)

尝试修改这个:

CREATE OR REPLACE FUNCTION F_WORKINGS_DAYS  
(V_START_DATE IN DATE, V_END_DATE IN DATE)

RETURN NUMBER IS
DAY_COUNT NUMBER := 0;
CURR_DATE DATE;

BEGIN -- loop through and update
CURR_DATE := V_START_DATE;
WHILE CURR_DATE <= V_END_DATE
LOOP
    IF TO_CHAR(CURR_DATE,'DY') NOT IN ('SAT','SUN') -- Change this bit to ignore all but Fridays
        THEN DAY_COUNT := DAY_COUNT + 1;
    END IF;
    CURR_DATE := CURR_DATE + 1;
END LOOP;

    RETURN DAY_COUNT;
END F_WORKINGS_DAYS;

/

答案 5 :(得分:-1)

SELECT (NEXT_DAY('31-MAY-2012','SUN')
-NEXT_DAY('04-MAR-2012','SUN'))/7 FROM DUAL

答案 6 :(得分:-1)

选择((DATEDIFF(dd,@ a,@ b))+ DATEPART(dw,(@ a-6)))/ 7