У меня есть этот код, который я пишу в хранимую процедуру:
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='22:30:00'
SET @EndTime='00:52: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
Это прекрасно работает, если вы используете любое значение времени, отличное от примера 00:52:00, который у меня есть. Например, если EndTime было 23:05, хранимая процедура работает отлично. Я провел некоторое исследование DATEPART, но не нашел ничего полезного в том, как заставить его правильно рассчитывать полночь по военному времени.
РЕДАКТИРОВАТЬ: Когда код работает правильно, он вычисляет время, за которое сколько часов между временем начала и окончания, и идея состоит в том, чтобы сохранять новые строки для каждого часа во временной таблице (в конечном итоге это будет сохранено в новую таблицу для отслеживания отключения по часам). Он работает, когда я запускаю его с 21:30 до 22:15. Я получаю две строки, отражающие период с 21:00 до 22:00 и с 22:00 до 23:00 (это та логика, которую я хочу). Но добавьте туда военную полночь, и я не получу никаких возвращенных строк, так как калькулятор не будет вычислять 00.
Я нашел примеры в своей базе данных, которые показывают время начала 22:00:0000 и время окончания 00:00:00.0000000, а затем наоборот. Таким образом, БУДЕТ вычисляться один из способов, где время начала равно 00, но если время начала равно 21:00:0000, а время окончания - 00:52:0000, то кубиков не будет. Я не возвращаю строки.
00:52
всегда больше, чем23:05
? Если бы вы перешли на полночь, то не запустил бы ли этот код бесконечный цикл? - person mellamokb   schedule 26.04.2012SELECT * FROM @temp_table
, но я подозреваю, что логика, которую вы используете выше, намного сложнее, чем должна быть. Кроме того, как код должен знать (если время начала — 22:30, а время окончания — 00:52), что была пересечена только одна полуночная граница? Что, если 22:30 было в прошлый четверг? - person Aaron Bertrand   schedule 26.04.2012