如何使用oracle sql中的select语句找到两个日期之间的周五数(包括两个日期)?
答案 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