2013-09-22 141 views
1

我在SQL Server中有一個表,它具有以下屬性。根據結束日期和持續時間查找開始日期 - T-SQL

ProjectID || Start_Date || End Date || Duration(Days) 
1        10-Jan-2013  5 
2        02-FEB 2013  16 
3        26-Mar-2013  50 
.         .    . 

我想根據合格的日期(週一至週五)找到開始日期。例如結束日期:1月10日開始日期爲1月4日,因爲1月5日和6日是週六和週日。

我想知道這在T-SQL(函數,自定義T-SQL塊)中是如何可能的。任何指導和幫助,高度讚賞。

+0

爲什麼1月4日沒有資格?這是星期五,根據你的名單,它應該工作。根據您的輸入和預期產出,看起來您希望結束日期減去5個工作日,其中工作日爲週一至週五。請澄清你想要的兩個中的哪一個。 – Neolisk

+0

@Neolisk 4月4日將有資格。對不起。如果持續時間超過5天,我如何才能找到開始日期。 – wali

回答

4

這應做到:

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 
+0

非常感謝,它的工作非常完美。你可以把它寫成一個T-SQL函數,這樣我可以輸入End_Date和Working Day並獲得StartDate作爲輸出。 – wali

+0

@wali:不客氣。請提供您想要的T-SQL函數的示例用法。我不清楚你打算如何指定工作日。還有持續時間呢?如果我是你,我會把星期六和星期六的一部分處理成一個函數,並把所有的東西都放在它之外。因此,輸入將是DATE類型的單個參數,輸出是DATE按需要向後移動1-2天以表示工作日。在上面的例子中,你可以有一個SELECT。 – Neolisk

+0

我用下面的查詢來更新我的表格。 'WITH AS tblProjects2( SELECT專案編號,DATEADD(DAY,-duration,結束日期)AS起始日期從tblProjects ) 更新orig_project_table設置起始日期=(選擇 CASE WHEN DATENAME(DW,起始日期)= '星期天',那麼DATEADD(天,-2,起始日期) WHEN DATENAME(DW,起始日期)= '星期六' THEN DATEADD(天,-1,起始日期) ELSE的StartDate END AS ProperStartDate FROM tblProjects2其中tblProjects2.ProjectID = orig_project_table.ProjectID);' – wali

1

難有一點閱讀,但稍快

SELECT ProjectId, 
DATEADD(d, -Duration - CASE DATEDIFF(d, +Duration, EndDate) % 7 
    WHEN 5 THEN 1 
    WHEN 6 THEN 2 
    ELSE 0 END 
    , EndDate) 
FROM tblProjects 
相關問題