Предыдущий час или X минут при привязке TSQL к окну

#tsql #time

#tsql #время

Вопрос:

В TSQL, как я могу привязать предыдущий час к часу.

Итак, например, если бы сейчас было 2: 33, как бы я получил поля, где CreationDate (поле datetime) больше или равно 1:00 и меньше 2:00.

Я также хотел бы делать это с 10-минутными интервалами (привязка к предыдущему:00 -: 10, если в настоящее время, например, было:14, или другой пример: 50-:00, если было: 06).

Ответ №1:

Это даст вам начало и конец текущего часа:

 select  dateadd(hour, datepart(hour, getdate()), 
            dateadd(day, 0, datediff(day, 0, getdate())))
,       dateadd(hour, 1 datepart(hour, getdate()), 
            dateadd(day, 0, datediff(day, 0, getdate())))
  

Объяснение: dateadd(day, 0, datediff(day, 0, getdate())) позволяет начать с сегодняшнего дня. Затем к этому добавляется текущий час.

Аналогично для предыдущего 10-минутного блока:

 select  dateadd(minute, datepart(minute, getdate()) / 10 * 10 - 10, 
            dateadd(hour, datepart(hour, getdate()), 
                dateadd(day, 0, datediff(day, 0, getdate()))))
,       dateadd(minute, datepart(minute, getdate()) / 10 * 10, 
            dateadd(hour, datepart(hour, getdate()), 
                dateadd(day, 0, datediff(day, 0, getdate()))))
  

Или другой способ его записи:

 declare @lowerBound datetime = dateadd(minute, datepart(minute, getdate()) / 10 * 10 - 10, 
            dateadd(hour, datepart(hour, getdate()), 
                dateadd(day, 0, datediff(day, 0, getdate()))))

declare @upperBound datetime = dateadd(minute, datepart(minute, getdate()) / 10 * 10, 
            dateadd(hour, datepart(hour, getdate()), 
                dateadd(day, 0, datediff(day, 0, getdate()))))

select @lowerBound, @upperBound
  

PS продолжайте хорошую работу над производительностью Stack Overflow!

Комментарии:

1. CurrentDate LowerDate UpperDate 2011-05-10 20:07:10.243 2011-05-10 20:00:00.000 2011-05-10 20:10:00.000 Кажется, текущий 10-минутный блок

2. @Кайл Брандт: Верно, ответ отредактирован, чтобы показать предыдущий 10-минутный блок.

3. Ах, ты опередил меня на две секунды:-P