首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算在某一范围内的工作日数,并在这些天在DB中输入

计算在某一范围内的工作日数,并在这些天在DB中输入
EN

Stack Overflow用户
提问于 2013-03-04 13:59:41
回答 4查看 231关注 0票数 0

我有一个有日期字段的表,每天将有多个条目。我需要清点那个工作日至少有一个条目的数量。

如果日期范围是27-2月-12到2-4月12日,那么就有26周的时间,如果我们所有工作日都有条目,它需要返回26天,如果在某一天没有条目,则返回较少的数目。

假设表Transaction具有tidtypecreateddate

有人能建议我一个好的SQL方法吗?我正在运行一个Oracle DB

EN

回答 4

Stack Overflow用户

发布于 2013-03-04 14:25:18

试着把这个问题分解成多个小问题。这里是如何..(在您的示例中,我使用的是3月10日而不是4月2日,以使数据集更小)。

得到两个日期之间的所有日期。

代码语言:javascript
复制
select to_date('27-feb-2012','dd-mon-yyyy') + level -1
from dual
connect by level < ( to_date('10-mar-12','dd-mon-yy') -
                     to_date('27-feb-2012','dd-mon-yyyy') +2
                   )
TO_DATE('
---------
27-FEB-12
28-FEB-12
29-FEB-12
01-MAR-12
02-MAR-12
03-MAR-12
04-MAR-12
05-MAR-12
06-MAR-12
07-MAR-12
08-MAR-12

接下来,把工作日从这个结果集中拿出来。

代码语言:javascript
复制
with all_days as (
        select to_date('27-feb-2012','dd-mon-yyyy') + level -1 date1
        from dual
        connect by level < ( to_date('10-mar-12','dd-mon-yy') -
                             to_date('27-feb-2012','dd-mon-yyyy') +2
                           )
)
select  date1,
        to_char(date1,'D'),
        to_char(date1,'Day') Day
from    all_days
where   to_number(to_char(date1,'D')) between 2 and 6 -- monday through friday
/

DATE1     T DAY
--------- - ---------
27-FEB-12 2 Monday
28-FEB-12 3 Tuesday
29-FEB-12 4 Wednesday
01-MAR-12 5 Thursday
02-MAR-12 6 Friday
05-MAR-12 2 Monday
06-MAR-12 3 Tuesday
07-MAR-12 4 Wednesday
08-MAR-12 5 Thursday
09-MAR-12 6 Friday

-最后,您的存在逻辑检查表中是否有此日期的数据。

代码语言:javascript
复制
with all_days as (
        select to_date('27-feb-2012','dd-mon-yyyy') + level -1 date1
        from dual
        connect by level < ( to_date('10-mar-12','dd-mon-yy') -
                             to_date('27-feb-2012','dd-mon-yyyy') +2
                           )
)
select  date1,
        to_char(date1,'D'),
        to_char(date1,'Day') Day
from    all_days
where   to_number(to_char(date1,'D')) between 2 and 6 -- monday through friday
  and   exists (
            select 1
            from your_table yt
            where yt.date_column = all_days.date_column
        )    
票数 0
EN

Stack Overflow用户

发布于 2013-03-04 14:37:28

代码语言:javascript
复制
select to_date('02-04-2012','DD-MM-YYYY')-
to_date('27-02-2012','DD-MM-YYYY')- 
2*(to_char(to_date('02-04-2012','DD-MM-YYYY'),'WW')-
to_char(to_date('27-02-2012','DD-MM-YYYY'),'WW'))+1 from dual;
票数 0
EN

Stack Overflow用户

发布于 2013-03-04 15:03:27

你在2013年的约会期间一共有25个工作日--我用了当年的数据。根据我的假设数据,你将得到17个工作日的条目。看到所有的日子,评论和()部分和取消评论Start_Date.和其他专栏。然后,您可以直观地计数以检查结果:

代码语言:javascript
复制
SELECT SUM(CASE WHEN Entry_Val > 0 THEN 1 ELSE 0 END) entry_days  --, Start_Date, Wk_Day, Day#, entry_val, lvl
  FROM
  (
   SELECT TO_CHAR(TO_DATE('27-FEB-12') + LEVEL-1, 'DD-MON-YYYY')   Start_Date
        , TO_CHAR(TO_DATE('27-FEB-12') + LEVEL-1, 'DY')            Wk_Day
        , TO_CHAR(TO_DATE('27-FEB-12') + LEVEL-1, 'D' )            Day#
        , MOD(LEVEL, 3)                                            Entry_Val -- Hypot. entry day - count only days with entry_val > 0 -- 
        , LEVEL                                                    lvl  -- added for clarity
     FROM dual CONNECT BY LEVEL <= (SELECT to_date('02-APR-12') - to_date('27-FEB-12') days_btwn FROM dual)
  )
  WHERE Wk_Day NOT IN ('SAT', 'SUN') -- OR -- Day# NOT IN (1, 7)
  /

ENTRY_DAYS
--------
17
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15203264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档