1

我需要编写一个函数,在一个名为 StartTime 的列中舍入时间,以仅显示小时并将其插入另一个名为 StartHour 的列。在另一个名为 EndTime 的列中,我还需要使用 DATEPART 向上舍入到下一个递增的小时(例如:23:33:00.0000000 将是 23(小时)+ 1(将其四舍五入到结束时间)= 24我需要将其保存到 EndHour 列)。

我想将这些新值插入到名为 StartHour 和 StartMinute、EndHour 和 EndMinute 的新列中(StartTime 和 EndTime 列是我以 time(7) 格式使用的原始值,出于历史目的,我保留它们在他们原来的列)。

这是我到目前为止在 T-SQL 中的内容:

SELECT (DATEPART(HOUR, [StartTime])) AS StartHour,(DATEPART(MINUTE, [StartTime])) AS StartMinute,
(DATEPART(HOUR, [EndTime])) AS EndHour, 
(DATEPART(MINUTE, [EndTime])) AS EndMinute, StartTime, EndTime
  FROM [test].[dbo].[Outage_Reports]
  ORDER BY OutageDate ASC

产生:

StartHour   StartMinute   EndHour       EndMinute      Startime          EndTime
16        0                 17       30            16:00:00    17:30:00

我现在需要将此转换写入一个存储过程,当开始和结束之间的长度超过一小时时,该存储过程还会在表中插入两个(或更多,如果中断持续几个小时)新行。或者在中断时间低于或等于一小时时插入一行。然后我需要在开始列和结束列中考虑每小时的进度。 像这样:

 StartHour   StartMinute    EndHour     EndMinute        Startime        EndTime
      16          0             17            00         16:00:00         17:30:00

(上面反映了停电的第一个小时,下面的第二行反映了停电的后半个小时,直到它停止......两者都将与表中的同一张停电单相关联)

    StartHour     StartMinute    EndHour    EndMinute    Startime      EndTime  
   17             30             18          00  16:00:00      17:30:00

这个想法是按小时跟踪网站中断,以便他们可以加入按小时跟踪订单的订单表(并且订单从不包含分钟......只有几个小时)。因此,计划是为持续 1.5 小时的中断制作两行,以便将 16、17 和一直到向上舍入的 18 小时值绑定到订单表,其中 30 分钟列作为另一个点计算量(所以一个半小时等于一小时的订单加上半小时的订单……逐行拆分)。这样我可以更好地跟踪中断期间的趋势。

对于如何将此逻辑写入存储过程,我有点不知所措。可以想象,我必须将新的小时和分钟值声明为变量,并且对于 StartHour 列,始终将其四舍五入为 DATEPART 小时值(即使它是 16:45...我想将 16 插入 StartHour 列)。但是,对于 EndHour 列,我想在 EndHour 列中插入一个向上取整的每小时值(17 和 18,因为在这种情况下我们已经过了一个小时)。这有望描述(通过这两行)发生中断的近两个小时。反过来,它可以轻松加入我们的订单表

任何有关此逻辑的存储过程的指导将不胜感激。

4

1 回答 1

1

好吧,我真的不明白目的!但逻辑可能如下所示——

declare @StartTime time
declare @EndTime time
declare @Temp_StartTime time

declare @temp_StartHour int
declare @temp_EndHour int
declare @temp_StartMinute int
declare @temp_EndMinute int

SET @StartTime='2:30:00'
SET @EndTime='4:01:00'
SET @Temp_StartTime=@StartTime

SET @temp_StartHour=DATEPART(HOUR, @StartTime)
SET @temp_EndHour=DATEPART(HOUR, @EndTime)
SET @temp_StartMinute=DATEPART(MI, @StartTime)
SET @temp_EndMinute=DATEPART(MI, @EndTime)

if(@temp_EndMinute>0)
    BEGIN
        SET @temp_EndHour=@temp_EndHour+1
    END

DECLARE @Temp_Table TABLE
(
  StartHour int,
  StartMinute int,
  EndHour int,
  EndMinute int,
  StartTime time,
  EndTime time
)

WHile((@temp_EndHour-@temp_StartHour>=1))
    BEGIN
        INSERT INTO @Temp_Table
        SELECT (DATEPART(HOUR, @Temp_StartTime)) AS StartHour,(DATEPART(MINUTE, @Temp_StartTime)) AS StartMinute,
        @temp_StartHour+1 AS EndHour, 
        0 AS EndMinute, @StartTime as StartTime, @EndTime as EndTime

        SET @temp_StartHour=@temp_StartHour+1
        SET @Temp_StartTime=DATEADD(HOUR,1,@Temp_StartTime)

        if(DATEPART(MI, @Temp_StartTime)!=0)
            BEGIN
                SET @Temp_StartTime=DATEADD(MI,-@temp_StartMinute,@Temp_StartTime)
            END
    END

SELECT * FROM @Temp_Table  

希望它会有所帮助。

于 2012-04-25T08:27:38.883 回答