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 tronque simplement les secondes et les minutes, produisant les résultats demandés dans la question. Comme @OMG Ponies l'a souligné, si vous voulez arrondir vers le haut/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 l'ajout du type de données date dans SQL Server 2008, j'utiliserais 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 dateheure en question et un point fixe dans le temps (0
, qui convertit implicitement 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 définie sur 00:00:00.000
:
select dateadd(day, @days, 0)
ou plus succinctement :
select dateadd(day, datediff(day, 0, @dt), 0)
Utilisation d'une partie de date différente (par exemple, hour
, mi
) fonctionnera en conséquence.