這應做到:
WITH tblProjects2 AS (
SELECT ProjectId, DATEADD(DAY, -Duration, EndDate) AS StartDate FROM tblProjects
)
SELECT ProjectId,
CASE WHEN DATENAME(DW, StartDate) = 'Sunday' THEN DATEADD(day, -2, StartDate)
WHEN DATENAME(DW, StartDate) = 'Saturday' THEN DATEADD(day, -1, StartDate)
ELSE StartDate END AS ProperStartDate
FROM tblProjects2
的方法是相當簡單 - 當你的新的日期適逢週末,減去1或2天,取決於它是否分別是週六或週日。對於tblProjects
測試用例結構:
CREATE TABLE [dbo].[tblProjects](
[ProjectId] [int] NULL,
[StartDate] [date] NULL,
[EndDate] [date] NULL,
[Duration] [int] NULL
)
對於同一測試案例的數據:
INSERT INTO tblProjects VALUES (1, NULL, '10-Jan-2013', 5);
INSERT INTO tblProjects VALUES (2, NULL, '02-FEB-2013', 16);
INSERT INTO tblProjects VALUES (3, NULL, '26-Mar-2013', 50);
編輯 - 相同的功能,使用功能:
CREATE FUNCTION dbo.getStartDate(@EndDate Date, @Duration int)
RETURNS DATE
AS
BEGIN
DECLARE @newDate DATE;
SET @newDate = DATEADD(day, [email protected], @EndDate);
RETURN (CASE
WHEN DATENAME(DW, @newDate) = 'Sunday' THEN DATEADD(day, -2, @newDate)
WHEN DATENAME(DW, @newDate) = 'Saturday' THEN DATEADD(day, -1, @newDate)
ELSE @newDate END)
END;
然後你可以像這樣重寫上述查詢:
SELECT ProjectId, dbo.getStartDate(EndDate, Duration) AS StartDate
FROM tblProjects
爲什麼1月4日沒有資格?這是星期五,根據你的名單,它應該工作。根據您的輸入和預期產出,看起來您希望結束日期減去5個工作日,其中工作日爲週一至週五。請澄清你想要的兩個中的哪一個。 – Neolisk
@Neolisk 4月4日將有資格。對不起。如果持續時間超過5天,我如何才能找到開始日期。 – wali