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

时间:2020-09-15 13:00:24

标签: sql sql-server-2008 sql-server-2012

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

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

请帮助解决此问题。

我的表格数据:

Table Data Attached

预期输出:

Expected Data Attached

4 个答案:

答案 0 :(得分:1)

您将必须在此处使用CASE表达式来实现此目的。由于一个月的持续时间是可变的,因此您无法将这些期间转换为更通用的值(例如,将期间转换为分钟并将其相加)。从2019年2月1日开始的“ 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;

答案 1 :(得分:0)

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

PlotView

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

例如,您可以添加一个月的日期:

double xMin = -500;
double xMax = 800;
double xRange = xMax - xMin;

double yRange = xRange / ActualWidth * ActualHeight;
double yMin = 58;
double yMax = yMin + yRange;

_model.Axes[0].Minimum = xMin;
_model.Axes[0].AbsoluteMinimum = xMin;

_model.Axes[0].Maximum = xMax;
_model.Axes[0].AbsoluteMaximum = xMax;

// Analogically, define limits of Y axe

答案 2 :(得分:0)

您是否可以根据查询的错误示例进行检查?

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

输出

Output

答案 3 :(得分:0)

谢谢大家!

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

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