0

我有一个带有日期字段的表格,每天都会有多个条目。我需要计算在该工作日至少有一个条目的工作日数。

如果日期范围是 12 年 2 月 27 日到 2012 年 4 月 2 日,则有 26 个工作日,如果我们在所有工作日都有条目,则需要返回 26,如果在特定日期没有条目,则需要返回较小的计数。

用, ,说一个表事务tidtypecreateddate

有人可以建议我一个好的 SQL 方法吗?我在 Oracle DB 上运行

4

4 回答 4

0
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;
于 2013-03-04T14:37:28.037 回答
0

我对这个问题的解释有点不同。@Pradeep,这就是你想要的吗?

SELECT COUNT(DISTINCT TRUNC(CreatedDate))
FROM Transaction
WHERE TRUNC(CreatedDate) BETWEEN DATE '2012-02-27' AND DATE '2012-04-02'
  AND TO_CHAR(CreatedDate, 'DY') NOT IN ('SAT', 'SUN')

如果您在 2012 年 2 月 27 日和 2012 年 4 月 2 日之间的所有星期一至星期五都有条目,则此查询的结果将为 26。任何一天有多少条目都没有关系,只要每天至少有一个。

如果您在两天内(例如 2/28 和 3/22)没有任何记录,则结果将为 24。

请注意,如果您的列包含时间组件,我TRUNC在上面的第一行和第三行中使用了。CreatedDate如果没有,您可以不使用 TRUNC。

于 2013-03-04T17:35:47.687 回答
0

尝试将问题分解为多个较小的问题。方法如下..(在您的示例中,我使用的是 3 月 10 日而不是 4 月 2 日,以保持数据集更小)。

获取两个日期之间的所有日期。

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

接下来,从这个结果集中得到工作日..

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

--最后,你的存在逻辑来检查你的表中是否有这个日期的任何数据。

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
        )    
于 2013-03-04T14:25:18.783 回答
0

您在 2013 年的日期之间总共有 25 个工作日 - 我使用的是当年。使用我的假设数据,您将获得 17 个总工作日的条目。要查看所有天的评论 SUM() 部分并取消注释 Start_Date... 和其他列。然后您可以目视计数以检查结果:

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
于 2013-03-04T15:03:27.413 回答