2012-02-15 14 views
1

ユーザーが月をクリックしてから、このストアドプロシージャが実行されます。予約された時間の合計と、フィルタされたグループを確認します。フィルタは複数の日付範囲に基づいていますか?

| Job Group | Month Booked | Time (hrs) | 
    Cleaning  Jan   7 

私は、次のSQLを持っている:

SELECT 
    tsks.grouping_ref, ttg.description AS grouping_desc, 
    SUM(ts.booked_time) AS booked_time_total, 
    DATENAME(MONTH, ts.start_dtm) + ' ' + DATENAME(YEAR, ts.start_dtm) AS month_name, 
    @month_ref AS month_ref 
FROM 
    timesheets ts 
JOIN 
    timesheet_categories cat ON ts.timesheet_cat_ref = cat.timesheet_cat_ref 
JOIN 
    timesheet_tasks tsks ON ts.task_ref = tsks.task_ref 
JOIN 
    timesheet_task_groupings ttg ON tsks.grouping_ref = ttg.grouping_ref 
WHERE 
    ts.status IN(1, 2) --Booked and approved 
    AND cat.is_leave_category = 0 --Ignore leave 
    AND DATEPART(YEAR, ts.start_dtm) = @Year 
    AND DATEPART(MONTH, ts.start_dtm) = @Month 
GROUP BY 
    tsks.grouping_ref, ttg.description, 
    DATENAME(MONTH, ts.start_dtm), 
    DATENAME(YEAR, ts.start_dtm) 
ORDER BY 
    grouping_desc 

は、私は、複数の日付範囲に基づいてフィルタリングします。

私はこれを追加する方法について考えた:

AND ((ts.start_dtm BETWEEN '2011-12-28' AND '2012-01-01') 
OR (ts.start_dtm BETWEEN '2012-01-02' AND '2012-01-29')) 

しかし、その後、ユーザが、それはORステートメントをさせて頂きますよう、それはまだすべてのレコードを表示しますクリックする何月も問題ないだろう実現。私は必要なもの

はmonth_refに基づいている何か、例えば次のとおりです。

CASE WHEN @month_ref = 81201 THEN 
AND (ts.start_dtm BETWEEN '2011-12-28' AND '2012-01-01') 
END 

しかし、case文は、単にWHERE句の後に行く必要があります。

私は2012年に約12会計年度があります。ユーザーが3月をクリックすると、正しいフィルタが起動するようにケースステートメントとして追加する必要があります。データベースts.start_dtm

は次のようになります。私の最初のポストのための十分な情報だった

2011-04-01 00:00:00.000 

希望?

私はこのケースの記述を書き留めています。それをどこに置くか、今何時間も試しています。

あなたは:)

答えて

0

はあなたの日付の不規則な性質がdatepartsを使用不可能に与えるのを助けることを願って。私はユーザーのクエリに基づいて許容される日付の一時的なテーブルを作成し、それに参加します。私のアプリの静的整数テーブルは、1〜64000のテーブルが異なる場合があります。

DECLARE 
    @startdate DateTime = '2012-05-01', 
    @EndDate DateTime = '2012-06-03' 

DECLARE 
    @AllDates TABLE (MyDate DateTime) 

INSERT INTO @AllDates 
SELECT 
    DATEADD(dd, StaticInteger, @startdate) 
FROM dbo.tblStaticIntegers 
WHERE StaticInteger <= DATEDIFF(dd, @startdate, @EndDate) 
+0

感謝を二つの日付を取得する代わりに、この参照テーブルに参加したりすることができます? –

+0

この例では、テンポラリ・テーブルを使用して、クエリがyesに対して実行する日付を格納しています。挿入文が動作するようにするために永続的な整数テーブルを作成する必要があります(まだ持っていないと仮定します) – u07ch

+0

私のストアドプロシージャは管理スタジオで動作するようですが、ウェブサイトはDATE BETWEENのように見えません。なぜどんなアイデア? –

0

一つのオプションは、このようにそれらの値を取得し、あなたのts.start_dtmチェックでそれらを使用して、開始日と終了日を月の参照番号をマッピングテーブルを持っていることであろう。つまり、次のようになります。

月 - スタート|終了
81201 | 2011-12-28 | 2012-01-01
81202 | 2012-01-02 | 2012-01-29

など

あなたのコードスニペットは、私のDBに一時テーブルを作成しますので、あなただけ、あなたのメインクエリの前に、このため

関連する問題