Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何计算几个工作小时后的未来日期时间_Sql_Sql Server - Fatal编程技术网

Sql 如何计算几个工作小时后的未来日期时间

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

我正在尝试计算从现在起2个或更多工作小时后的日期,即使我将在周末或工作时间后开始计算,它应该是这样的: 工作时间为上午8点至下午4点 我在周五下午3点开始计算,所以若我开始计算,结果应该是周一上午9点

      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 |
+------------+-------------------------+-------------------------+---------------------+-------------------------+--------------+-------------------------+