2013-04-18 70 views
0

我有一個存儲過程,需要返回每週在不同日子進行的項目的每週計劃。它需要一個開始日期。t-sql幫助。需要返回該日期參數的當前一週數據

@StartDate DATETIME 

根據傳入的startdate,我需要返回該周的所有數據行,從週二開始到下週一結束。

只考慮startdate,我如何將星期的開始設置爲星期二,然後讓我的查詢返回特定星期範圍內的數據?

我知道SQL中的日期函數什麼都沒有。

我確實看到你可以將DATEFIRST設置爲2(我認爲它是星期二),但我不知道如何在日期中找到並找到那一週。我假設我需要兩個變量來設置星期的開始日期和星期結束日期並返回該範圍內的數據?

這裏是我的查詢,目前僅返回傳入當前日期:

SELECT 
    PS.ProductionDate, 
    L.Name, 
    S.Name, 
    PS.PartNo, 
    --PM.DisplayName, 
    PS.LotNo, 
    WC.Name, 
    WC2.Name, 
    PSS.Name, 
    PS.Mixing, 
    PS.Glazing, 
    PS.StartTime, 
    PS.[Weight], 
    PS.Pallets 
    FROM PROD_ProductionSchedule PS 
    --LEFT OUTER JOIN PartMaster PM on PS.PartNo = PM.Name 
    LEFT OUTER JOIN Location L on PS.LocationId = L.Id 
    LEFT OUTER JOIN PROD_Shifts S on PS.ShiftId = S.Id 
    LEFT OUTER JOIN PROD_WorkCenters WC on PS.OvenId = WC.Id 
    LEFT OUTER JOIN PROD_WorkCenters WC2 on PS.LineId = WC2.Id 
    LEFT OUTER JOIN PROD_ProductionScheduleStatus PSS ON PS.ScheduleStatusId = PSS.Id 
    WHERE [email protected] 
    AND PS.LocationId = CASE WHEN @Location = -1 THEN PS.LocationId ELSE @Location END 
    AND PS.PartNo = CASE WHEN @PartNo = 'ALL' THEN PS.PartNo ELSE @PartNo END 

回答

0

計算一週的開始和結束:

declare @StartOfWeek datetime 
declare @EndOfWeek datetime 

if DATEPART(weekday,@StartDate) = 3 --Tuesday 
begin 
    set @StartOfWeek = @StartDate 
    set @EndOfWeek = dateadd(week,1,@StartDate) 
end 
else if DATEPART(weekday,@startdate) > 3 
begin 
    set @StartOfWeek = dateadd(DAY,-(DATEPART(weekday,@startdate)-3),@StartDate) 
    set @EndOfWeek = dateadd(DAY,10-DATEPART(weekday,@startdate),@StartDate) 
end 
else 
begin 
    set @StartOfWeek = dateadd(DAY,-4-(DATEPART(weekday,@startdate)),@StartDate) 
    set @EndOfWeek = dateadd(DAY,3-DATEPART(weekday,@startdate),@StartDate) 
end 

然後你就可以在WHERE子句中使用這些:

WHERE PS.ProductionDate between @StartOfWeek and @EndOfWeek 
1

獲取本週的星期二和7天后:

select dateadd(dd, 3 - datepart(dw, getdate()), 
getdate()), dateadd(dd, 10 - datepart(dw, getdate()), getdate()) 
0

首先,創建一個calendar table,其中包含任意給定日期的工作周的第一天和最後一天的兩列。然後,你可以寫一些非常明確的,簡單的代碼:

declare @FirstDayOfWorkingWeek date, 
     @LastDayOfWorkingWeek date 

select 
    @FirstDayOfWorkingWeek = FirstDayOfWorkingWeek, 
    @LastDayOfWorkingWeek = LastDayOfWorkingWeek 
from 
    dbo.Calendar 
where 
    [Date] = @StartDate 

select * 
from dbo.PROD_ProductionSchedule 
where ProductionDate between @FirstDayOfWorkingWeek and @LastDayOfWorkingWeek 

,並根據您存儲日期,是用BETWEEN知道potential issues的。

使用日曆表幾乎總是優於使用函數進行日期計算,因爲您可以輕鬆讀取和驗證日期;你可以用UPDATE你的表來處理常規邏輯的異常;你的代碼通常更易讀易維護;如果你在表上使用JOIN而不是使用嵌套函數,性能會更好。