Sql 如何计算几个工作小时后的未来日期时间
我正在尝试计算从现在起2个或更多工作小时后的日期,即使我将在周末或工作时间后开始计算,它应该是这样的: 工作时间为上午8点至下午4点 我在周五下午3点开始计算,所以若我开始计算,结果应该是周一上午9点Sql 如何计算几个工作小时后的未来日期时间,sql,sql-server,Sql,Sql Server,我正在尝试计算从现在起2个或更多工作小时后的日期,即使我将在周末或工作时间后开始计算,它应该是这样的: 工作时间为上午8点至下午4点 我在周五下午3点开始计算,所以若我开始计算,结果应该是周一上午9点 if(@data_przyj>@WorkStart AND DATEPART(DATEADD(MINUTE,@ileNaZapytanie,@data_przyj)<@WorkFinish) BEGIN while (DATEPART
if(@data_przyj>@WorkStart AND DATEPART(DATEADD(MINUTE,@ileNaZapytanie,@data_przyj)<@WorkFinish)
BEGIN
while (DATEPART(dw, @CurrentDate)!=1 AND DATEPART(dw, @CurrentDate)!=7))
BEGIN
SET @CurrentDate = DATEADD(day, 1, @CurrentDate)
SET @czyBylPrzeskok =1
END
if (@czyBylPrzeskok =1)
BEGIN
SET @LastDay = @CurrentDate
SET @LastDay = DATEADD(MINUTE, datediff(MINUTE,DATEADD(dd, 0, DATEDIFF(MINUTE, 0, @data_przyj)),@WorkStart), @LastDay)
SET @LastDay = DATEADD(HOUR, datediff(MINUTE,DATEADD(dd, 0, DATEDIFF(HOUR, 0, @data_przyj)),@WorkStart), @LastDay)
END
ELSE
BEGIN
SET @LastDay = DATEADD(MINUTE,@ileNaZapytanie,@data_przyj)
END
SET @IsCalculated = 1
END
else if(@data_przyj>@WorkStart AND DATEADD(MINUTE,@ileNaZapytanie,@data_przyj)>@WorkFinish)
BEGIN
SET @LastDay =DateADD(DD,3,GETDATE());
SET @IsCalculated = 1
END
else if(@data_przyj<@WorkStart )
BEGIN
SET @LastDay =GETDATE();
SET @IsCalculated = 1
END
END
if(@data\u przyj>@WorkStart和DATEPART(DATEADD(分钟,@ileNaZapytanie,@data\u przyj)@WorkStart和DATEADD(分钟,@ileNaZapytanie,@data\u przyj)>@WorkFinish)
开始
SET@LastDay=DateADD(DD,3,GETDATE());
设置@IsCalculated=1
结束
否则,如果(@data_przyj以下解决方案使用带有工作时间的日历表,则使用滚动总和累积每天的工作时间,并找出需要结束的日期
使用日历表将使您能够灵活地拥有不同的业务时间段,并非常轻松地添加或删除假期
设置(日历表):
建议的解决方案:
DECLARE @v_BusinessHoursToAdd INT = 2
DECLARE @v_CurrentDateTimeHour DATETIME = '2019-09-06 15:00'
;WITH CalendarFromNow AS
(
SELECT
T.Date,
WorkingStartTime = CASE
WHEN @v_CurrentDateTimeHour BETWEEN T.WorkingStartTime AND T.WorkingEndTime THEN @v_CurrentDateTimeHour
ELSE T.WorkingStartTime END,
WorkingEndTime = T.WorkingEndTime
FROM
#WorkingCalendar AS T
WHERE
T.Date >= CONVERT(DATE, @v_CurrentDateTimeHour) AND
T.IsWorkingDay = 1
),
RollingBusinessSum AS
(
SELECT
C.Date,
C.WorkingStartTime,
C.WorkingEndTime,
AmountBusinessHours = DATEDIFF(HOUR, C.WorkingStartTime, C.WorkingEndTime),
RollingBusinessHoursSum = SUM(DATEDIFF(HOUR, C.WorkingStartTime, C.WorkingEndTime)) OVER (ORDER BY C.Date),
PendingHours = @v_BusinessHoursToAdd - SUM(DATEDIFF(HOUR, C.WorkingStartTime, C.WorkingEndTime)) OVER (ORDER BY C.Date)
FROM
CalendarFromNow AS C
)
SELECT TOP 1
EndingHour = DATEADD(
HOUR,
R.PendingHours,
R.WorkingEndTime)
FROM
RollingBusinessSum AS R
WHERE
R.PendingHours < 0
ORDER BY
R.Date
第二个CTERollingBusinessSum是计算每天的营业时数,并在几天内累计。最后一列PendingHours是我们需要从现在开始加上的小时数减去几天的营业时数之和的结果
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+
| Date | WorkingStartTime | WorkingEndTime | AmountBusinessHours | RollingBusinessHoursSum | PendingHours |
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+
| 2019-09-06 | 2019-09-06 15:00:00.000 | 2019-09-06 16:00:00.000 | 1 | 1 | 1 |
| 2019-09-09 | 2019-09-09 08:00:00.000 | 2019-09-09 16:00:00.000 | 8 | 9 | -7 |
| 2019-09-10 | 2019-09-10 08:00:00.000 | 2019-09-10 16:00:00.000 | 8 | 17 | -15 |
| 2019-09-11 | 2019-09-11 08:00:00.000 | 2019-09-11 16:00:00.000 | 8 | 25 | -23 |
| 2019-09-12 | 2019-09-12 08:00:00.000 | 2019-09-12 16:00:00.000 | 8 | 33 | -31 |
| 2019-09-13 | 2019-09-13 08:00:00.000 | 2019-09-13 16:00:00.000 | 8 | 41 | -39 |
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+
最后,PendingHours列为负数的第一天是我们计算出要添加的小时数的那一天。这是带有ORDER BY
的前1个
。要获得最终的日期时间,我们只需将等待的小时数减去该特定日期的结束时间
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+-------------------------+
| Date | WorkingStartTime | WorkingEndTime | AmountBusinessHours | RollingBusinessHoursSum | PendingHours | EndingHour |
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+-------------------------+
| 2019-09-09 | 2019-09-09 08:00:00.000 | 2019-09-09 16:00:00.000 | 8 | 9 | -7 | 2019-09-09 09:00:00.000 |
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+-------------------------+
您可能需要调整性能并进行边界测试,但这可能会让您灵活了解如何在节假日或不同时间段使用工作时间。公共假期如何?我在所有假期中都有基本假期,所以我只需检查相同的日期是否为周末,但最困难的部分是计算,这并不能真正回答我的问题1.在这个时候,假期可以skipped@garondi5…样本数据和期望的结果将非常有用。
+------------+-------------------------+-------------------------+
| Date | WorkingStartTime | WorkingEndTime |
+------------+-------------------------+-------------------------+
| 2019-09-06 | 2019-09-06 15:00:00.000 | 2019-09-06 16:00:00.000 |
| 2019-09-09 | 2019-09-09 08:00:00.000 | 2019-09-09 16:00:00.000 |
| 2019-09-10 | 2019-09-10 08:00:00.000 | 2019-09-10 16:00:00.000 |
| 2019-09-11 | 2019-09-11 08:00:00.000 | 2019-09-11 16:00:00.000 |
| 2019-09-12 | 2019-09-12 08:00:00.000 | 2019-09-12 16:00:00.000 |
| 2019-09-13 | 2019-09-13 08:00:00.000 | 2019-09-13 16:00:00.000 |
| 2019-09-16 | 2019-09-16 08:00:00.000 | 2019-09-16 16:00:00.000 |
+------------+-------------------------+-------------------------+
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+
| Date | WorkingStartTime | WorkingEndTime | AmountBusinessHours | RollingBusinessHoursSum | PendingHours |
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+
| 2019-09-06 | 2019-09-06 15:00:00.000 | 2019-09-06 16:00:00.000 | 1 | 1 | 1 |
| 2019-09-09 | 2019-09-09 08:00:00.000 | 2019-09-09 16:00:00.000 | 8 | 9 | -7 |
| 2019-09-10 | 2019-09-10 08:00:00.000 | 2019-09-10 16:00:00.000 | 8 | 17 | -15 |
| 2019-09-11 | 2019-09-11 08:00:00.000 | 2019-09-11 16:00:00.000 | 8 | 25 | -23 |
| 2019-09-12 | 2019-09-12 08:00:00.000 | 2019-09-12 16:00:00.000 | 8 | 33 | -31 |
| 2019-09-13 | 2019-09-13 08:00:00.000 | 2019-09-13 16:00:00.000 | 8 | 41 | -39 |
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+-------------------------+
| Date | WorkingStartTime | WorkingEndTime | AmountBusinessHours | RollingBusinessHoursSum | PendingHours | EndingHour |
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+-------------------------+
| 2019-09-09 | 2019-09-09 08:00:00.000 | 2019-09-09 16:00:00.000 | 8 | 9 | -7 | 2019-09-09 09:00:00.000 |
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+-------------------------+