T-SQL datetime arredondado ao minuto mais próximo e horas mais próximas com o uso de funções

No SQL Server 2008, gostaria de obter a coluna datetime arredondada para a hora mais próxima e o minuto mais próximo, de preferência com funções existentes em 2008.

Para este valor de coluna 2007-09-22 15:07:38.850 , a saída será semelhante:

 2007-09-22 15:08 -- nearest minute 2007-09-22 15 -- nearest hour 

 declare @dt datetime set @dt = '09-22-2007 15:07:38.850' select dateadd(mi, datediff(mi, 0, @dt), 0) select dateadd(hour, datediff(hour, 0, @dt), 0) 

retornará

 2007-09-22 15:07:00.000 2007-09-22 15:00:00.000 

O acima apenas trunca os segundos e minutos, produzindo os resultados solicitados na questão. Como o @OMG Ponies apontou, se você quiser arredondar para cima / para baixo, então você pode adicionar meio minuto ou meia hora respectivamente, depois truncar:

 select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0) select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0) 

e você terá:

 2007-09-22 15:08:00.000 2007-09-22 15:00:00.000 

Antes da data tipo de dados foi adicionado no SQL Server 2008, eu usaria o método acima para truncar a parte do tempo de um datetime para obter apenas a data. A ideia é determinar o número de dias entre o datetime em questão e um ponto fixo no tempo ( 0 , que implicitamente é convertido para 1900-01-01 00:00:00.000 ):

 declare @days int set @days = datediff(day, 0, @dt) 

e, em seguida, adicione esse número de dias ao ponto fixo no tempo, que fornece a data original com o tempo definido como 00:00:00.000 :

 select dateadd(day, @days, 0) 

ou mais sucintamente:

 select dateadd(day, datediff(day, 0, @dt), 0) 

Usando uma datapart diferente (por exemplo, hour , mi ) funcionará de acordo.

“Arredondado” como no seu exemplo. Isso retornará um valor varchar da data.

 DECLARE @date As DateTime2 SET @date = '2007-09-22 15:07:38.850' SELECT CONVERT(VARCHAR(16), @date, 120) --2007-09-22 15:07 SELECT CONVERT(VARCHAR(13), @date, 120) --2007-09-22 15