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)
retournera
2007-09-22 15:07:00.000
2007-09-22 15:00:00.000
La méthode ci-dessus ne fait que tronquer les secondes et les minutes, produisant ainsi les résultats demandés dans la question. Comme l'a souligné @OMG Ponies, si vous voulez arrondir vers le haut ou vers le bas, vous pouvez ajouter une demi-minute ou une demi-heure respectivement, 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 obtiendrez :
2007-09-22 15:08:00.000
2007-09-22 15:00:00.000
Avant le date a été ajouté dans SQL Server 2008, j'utiliserais la méthode ci-dessus pour tronquer la partie temps d'un temps de date pour obtenir uniquement la date. L'idée est de déterminer le nombre de jours entre la date en question et un point fixe dans le temps ( 0
qui est implicitement converti en 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 réglée sur 00:00:00.000
:
select dateadd(day, @days, 0)
ou plus succinctement :
select dateadd(day, datediff(day, 0, @dt), 0)
L'utilisation d'une autre partie de la date (par ex. hour
, mi
) fonctionneront en conséquence.
6 votes
L'exemple de la minute la plus proche ne devrait-il pas être 15:08 ? Parce que les secondes d'une minute font 60...
0 votes
Avez-vous intentionnellement omis de corriger cette erreur lorsque vous avez édité sa question afin de pouvoir faire ce commentaire ?
0 votes
@MrWednesday Vous réalisez qu'il y a plus de 10 minutes entre l'édition et ce commentaire. J'imagine que la pensée est venue après.