0

日付フィールドを持つテーブルがあり、毎日複数のエントリがあります。その平日に少なくとも 1 つのエントリがある平日の数を取得する必要があります。

日付範囲が 2012 年 2 月 27 日から 2012 年 4 月 2 日までの場合、平日は 26 日あり、すべての平日にエントリがある場合は 26 を返す必要があり、特定の日にエントリがない場合はより少ない数を返す必要があります。

、、とのテーブルトランザクションを言います。tidtypecreateddate

誰かが私に良いSQLアプローチを提案してもらえますか? Oracle DB で実行しています

4

4 に答える 4

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になります。特定の日にエントリがいくつあるかは関係ありません。毎日少なくとも1つあります。

2日間(たとえば2/28と3/22)のレコードがない場合、結果は24になります。

列に時間コンポーネントが含まれているTRUNC場合に備えて、上記の1行目と3行目で使用したことに注意してください。CreatedDateそうでない場合は、TRUNCなしで行うことができます。

于 2013-03-04T17:35:47.687 に答える
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

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 に答える
0

問題を複数の小さな問題に分解してみてください。これが方法です..(データセットを小さく保つために、例では4月2日の代わりに3月10日を使用しています)。

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 に答える