2013-09-22 140 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 
相关问题