2012-02-15 71 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')) 

但後來意識到它不會有問題,用戶點擊何年何月它仍然會顯示,因爲它會進行或聲明的所有記錄。

我需要什麼樣的東西,是基於該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月的會計,我需要添加爲case語句,這樣,當用戶點擊三月,它會觸發正確的過濾器。

在數據庫ts.start_dtm看起來是這樣的:

2011-04-01 00:00:00.000 

希望那是足夠的信息,我的第一篇文章?

我堅持寫case語句,並把它放在哪裏,現在一直在努力了幾個小時。

希望你能幫助:)

回答

0

給你的日期將排除使用日期部分的不規則性質;我會根據用戶查詢建立一個允許日期的臨時表並加入。在我的應用程序中的靜態整數表有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

感謝這個,所以你的代碼片段在我的數據庫創建臨時表? – 2012-02-15 14:28:40

+0

該示例使用臨時表來存儲查詢將運行的日期與yes。您將需要創建一個整數的永久表,讓插入語句工作(假設你不已經有一個) – u07ch 2012-02-16 11:13:57

+0

我的存儲過程似乎是在管理工作室,但該網站似乎並不喜歡之間date工作。任何想法爲什麼? – 2012-02-22 15:58:44

0

一種選擇是有一個表映射月份參考號碼的開始和結束日期因而檢索這些值,並在您檢查ts.start_dtm使用它們。即它會有:

Month-ref |開始|結束
81201 | 2011-12-28 | 2012-01-01
81202 | | 2012-01-29

您可以直接加入到這個參考表或可替代的主查詢檢索前兩個日期