如何根据开始日期和持续时间查找结束日期

How to find end date based on start date & duration

我为我的组织开发了在线培训注册应用程序。在此应用程序中,我们有 StartDateDurationDuration Type 列以及其他一些列,但没有 EndDate 列。

现在我面临着根据 StartDateDuration 找到结束日期的挑战。

请帮忙解决这个问题。

我的table数据:

预期输出:

您可以使用函数 DATEADD 查找结束日期。

DATEADD (datepart , number , date ) 

您可以添加各种类型的持续时间(年、月、日、时、分、秒等)

例如,要将日期添加一个月,您可以这样做:

SELECT DATEADD(month, 1, '20200915');

您能否根据查询ill-prepared 简短示例检查一下。

DECLARE @table TABLE
(
    StartDate DATETIME,
    EenDate DATETIME  NULL,
    Duration INT,
    Type NVARCHAR(20)
)

INSERT INTO @table VALUES ('2020-08-18',NULL,15,'Days'),
('2020-08-18',NULL,10,'Month'),
('2020-08-18',NULL,10,'Hours'),
('2020-08-18',NULL,2,'Year')

SELECT * FROM @table

SELECT StartDate,CASE WHEN [Type] = 'Days' THEN CONVERT(DATE,DATEADD(DAY,Duration,StartDate))
WHEN [Type] = 'Month' THEN CONVERT(DATE,DATEADD(MONTH,Duration,StartDate))
WHEN [Type] = 'Hours' THEN CONVERT(DATE,DATEADD(HOUR,Duration,StartDate))
WHEN [Type] = 'Year' THEN CONVERT(DATE,DATEADD(YEAR,Duration,StartDate))
END EenDate,
Duration,Type FROM @table

输出

您将不得不在此处使用 CASE 表达式来实现此目的。由于一个月的持续时间可变,您无法将这些时间段转换为更通用的值(例如将时间段转换为分钟并相加)。 “1个月”从2019年2月1日算起只有28天,但是从2020年3月1日算起是31天。

结果如下:

SELECT YT.StartDatY,
       CASE DurationType WHEN 'Minutes' THEN DATEADD(MINUTE,YT.Duration,UT.StartDate)
                         WHEN 'Hours' THEN DATEADD(HOUR,YT.Duration,UT.StartDate)
                         WHEN 'Days' THEN DATEADD(DAY,YT.Duration,UT.StartDate)
                         WHEN 'Months' THEN DATEADD(MONTH,YT.Duration,UT.StartDate)
                         WHEN 'Years' THEN DATEADD(Year,YT.Duration,UT.StartDate)
       END AS EndDate,
       YT.Duration,
       YT.DurationType
FROM dbo.YourTable YT;

下面的查询返回了准确的预期输出。

SELECT StartDate,CASE WHEN [Type] = 'Days' THEN CONVERT(DATE,DATEADD(DAY,Duration,StartDate))
WHEN [Type] = 'Months' THEN CONVERT(DATE,DATEADD(MONTH,Duration,StartDate))
WHEN [Type] = 'Hours' THEN CONVERT(DATE,DATEADD(HOUR, Duration, cast(cast(StartDate as date) as datetime)))
WHEN [Type] = 'Year' THEN CONVERT(DATE,DATEADD(YEAR,Duration,StartDate))
END EndDate,
Duration,Type FROM Testing1