计算日期范围内的星期六和星期日的数量 - oracle

时间:2014-08-20 08:25:18

标签: oracle

我有两个参数( start_Date,end_Date )来自 table1

我试图计算日期范围内的星期六和星期日

star_Date=8/20/2014 13:52
end_Date=8/28/2014 13:52

结果应该是这样的

Start_Date        end_date          No_of_leaves 
8/20/2014 13:52   8/28/2014 13:52       2

更新栏目

SELECT retouch_req_time,retouch_submit_time,(
        SELECT Count(*) FROM (SELECT To_char(start_date + ( LEVEL - 1 ), 'fmday') dt 
        FROM (WITH t AS (SELECT To_date (retouch_req_time, 'MM/DD/YYYY HH24:MI') start_date, To_date (retouch_submit_time, 'MM/DD/YYYY HH24:MI') end_date FROM TT)) 
        CONNECT BY LEVEL <= end_date - start_date + 1) WHERE dt IN ('friday','saturday')) as worked_hours
FROM TT

2 个答案:

答案 0 :(得分:1)

您可以计算星期六和星期日的数量:

with t(d) as (
  select sysdate + level from dual connect by rownum < 10
)
select count(case when trim(to_char(d, 'DAY')) in ('SATURDAY', 'SUNDAY') then 1 end) cnt from t

CNT
---
  2

如果您没有一系列日期,那么:

with t(a, b) as (
  select sysdate a, sysdate + 10 b from dual connect by rownum < 10
), t2(d) as (
  select a + level - 1 from t connect by rownum <= b - a
)
select count(case when trim(to_char(d, 'DAY')) in ('SATURDAY', 'SUNDAY') then 1 end) cnt from t2

CNT
---
  2

答案 1 :(得分:1)

您可以尝试使用分层查询

WITH t 
     AS (SELECT To_date ('8/20/2014 13:52', 'MM/DD/YYYY HH24:MI') start_date, 
                To_date ('8/28/2014 13:52', 'MM/DD/YYYY HH24:MI') end_date 
         FROM   dual) 
SELECT Count(*) 
FROM   (SELECT To_char(start_date + ( LEVEL - 1 ), 'fmday') dt 
        FROM   t 
        CONNECT BY LEVEL <= end_date - start_date + 1) 
WHERE  dt IN ( 'friday', 'saturday' );


RESULT
------
2

*通过扩大范围列出日期。 * TO_CHAR函数用于获取工作日 *计算周五或周六的外出时间

如果您想查找明智的计数,那么您可以尝试

SELECT To_char(dat, 'DY'), 
       Count(*) 
FROM   (SELECT To_date ('8/20/2014 13:52', 'MM/DD/YYYY HH24:MI') 
               + num dat 
        FROM   (SELECT LEVEL - 1 num 
                FROM   dual 
                CONNECT BY LEVEL <= Abs(To_date ('8/20/2014 13:52', 
                                        'MM/DD/YYYY HH24:MI') - 
                                                             To_date ( 
                                        '8/28/2014 13:52' 
                                                             , 
                                        'MM/DD/YYYY HH24:MI')) - 1 
               )) 
WHERE  To_char(dat, 'DY') IN ( 'FRI', 'SAT' ) 
GROUP  BY To_char(dat, 'DY');


RESULTS

TO_CHAR(DAT,'DY')   COUNT(*)
-----------------   --------
FRI                   1
SAT                   1