2013-04-19 2 views
0

Каков умный способ определить, находится ли текущее время между 59-й минутой этого часа и первой минутой следующего часа, используя чистый TSQL на MSSQL 2012?Проверка времени на SQL Server 2012?

Я не хочу отрезать время от «сейчас», я хочу отрезать дату и просто сделать расчет времени.

Это дает мне вид закрытия: Datepart for time between (instead of Convert date), но не совсем так, поскольку мне нужно рассчитать на основе текущего времени, а не значений таблицы.

Следующая может помочь проиллюстрировать, если сервер находится в настоящее время в «плохое время» и должен возвращать значение «1»

14:58:59 , Should not be considered in the "bad time" 
14:59:00 , Should be considered in the "bad time" 
14:59:04 , Should be considered in the "bad time" 
14:59:57 , Should be considered in the "bad time" 
15:00:02 , Should be considered in the "bad time" 
15:01:26 , Should not be considered in the "bad time" 
15:02:00 , Should not be considered in the "bad time" 
15:02:01 , Should not be considered in the "bad time" 

Спасибо.

EDIT:

Этот код работает, но я уверен, что это может быть сделано более эффективно. Все рекомендации приветствуются. Еще раз спасибо.

declare @now time = (select cast(sysutcdatetime() as time )) 
declare @floor time = (select dateadd(minute , 59 , (dateadd(hour,datediff(hour,0,@now),0)))) 
declare @ceiling time =( select dateadd(minute , 2 , @floor)) 
if (@now > @floor and @now < @ceiling) 
begin 
    select 1 as bit 
end 
select @now , @floor , @ceiling 
+0

Можете ли вы уточнить, что вы подразумеваете под " между 59-й минутой ... и первой минутой "? Возможно, вы могли бы привести несколько примеров, таких как '14:58:59, 14:59:00, 14:59:04, 14:59:57, 15:00:02, 15:01:26, 15:02:00 , 15: 02: 01', и укажите, какие из них должны быть включены? В настоящее время описание неоднозначно, так как «BETWEEN» может включать или не включать в себя включительно на каждом конце диапазона, и будет ли конечный диапазон 00:01, 00:01:59 или что-то еще. –

ответ

1

Пожалуйста, замените @dt в соответствии с требованиями:

declare @dt datetime = '20130419 21:59:01' 

select case when datepart(minute, @dt) in (59,0) 
      then 'Minute is between 59 and 1' 
      else 'Minute is NOT between 59 and 1' 
     end myMinute 
3
IF DATEPART(MINUTE, SYSDATETIME()) = 59 
    PRINT '59th minute';