我在SQL Server中有一个具有以下属性的表。
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日和1月6日是“星期六”和“星期日”。
我想知道在T-SQL(功能,自定义T-SQL块)中如何做到这一点。任何指导和帮助都将受到高度赞赏。
这应该做到这一点:
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, -@Duration, @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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句