web-dev-qa-db-fra.com

Date et heure de T-SQL arrondies à la minute et heures les plus proches à l'aide de fonctions

Dans SQL Server 2008, je souhaiterais que la colonne date/heure soit arrondie à l’heure et à la minute la plus proche, de préférence avec les fonctions existantes en 2008.

Pour cette colonne, valeur 2007-09-22 15:07:38.850, le résultat ressemblera à ceci:

2007-09-22 15:08 -- nearest minute
2007-09-22 15    -- nearest hour
103
user219628
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)

reviendra

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

Ce qui précède ne fait que tronquer les secondes et les minutes, produisant les résultats demandés dans la question. Comme @OMG Ponies l'a fait remarquer, si vous voulez arrondir les limites, vous pouvez ajouter une demi-minute ou une demi-heure, puis tronquer:

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

et vous aurez:

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

Avant que le type de données date soit ajouté dans SQL Server 2008, j'utilisais la méthode ci-dessus pour tronquer la partie heure d'un datetime pour obtenir uniquement la date. L’idée est de déterminer le nombre de jours entre la date et l’heure en question et un moment précis (0, qui jette implicitement sur 1900-01-01 00:00:00.000):

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

puis ajoutez ce nombre de jours au point fixe dans le temps, ce qui vous donne la date d'origine avec l'heure définie sur 00:00:00.000:

select dateadd(day, @days, 0)

ou plus succinctement:

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

Utiliser un autre datepart (par exemple, hour, mi) fonctionnera en conséquence.

189
Jeff Ogata

"Arrondi" comme dans votre exemple. Cela retournera une valeur varchar de la date.

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
23
Magnus

Je me rends compte que cette question est ancienne et qu’il existe une réponse acceptée et une autre solution. Je me rends également compte que ma réponse ne répondra qu'à la moitié de la question, mais pour tous ceux qui souhaitent arrondir à la minute près et conserver une valeur compatible date/heure utilisant une seule fonction:

CAST(YourValueHere as smalldatetime);

Pendant des heures ou des secondes, utilisez la réponse de Jeff Ogata (la réponse acceptée) ci-dessus.

6
Andrew Steitz