Pour arrondir au jour entier le plus proche , il existe trois approches largement utilisées. Le premier utilise datediff
pour trouver le nombre de jours depuis le 0
dateheure. Le 0
datetime correspond au 1er janvier 1900. En ajoutant la différence de jour à la date de début, vous avez arrondi à un jour entier ;
select dateadd(d, 0, datediff(d, 0, getdate()))
La deuxième méthode est basée sur le texte :elle tronque la description du texte avec varchar(10)
, ne laissant que la partie date :
select convert(varchar(10),getdate(),111)
La troisième méthode utilise le fait qu'un datetime
est vraiment une virgule flottante représentant le nombre de jours depuis 1900. Donc en l'arrondissant à un nombre entier, par exemple en utilisant floor
, vous obtenez le début de la journée :
select cast(floor(cast(getdate() as float)) as datetime)
Pour répondre à votre deuxième question, le début de la semaine est plus délicat. Une façon consiste à soustraire le jour de la semaine :
select dateadd(dd, 1 - datepart(dw, getdate()), getdate())
Cela renvoie également une partie temporelle, vous devrez donc la combiner avec l'une des méthodes de suppression de temps pour accéder à la première date. Par exemple, avec @start_of_day
comme variable de lisibilité :
declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(dd, 1 - datepart(dw, @start_of_day), @start_of_day)
Le début de l'année, le mois, l'heure et la minute toujours travailler avec l'approche "différence depuis 1900" :
select dateadd(yy, datediff(yy, 0, getdate()), 0)
select dateadd(m, datediff(m, 0, getdate()), 0)
select dateadd(hh, datediff(hh, 0, getdate()), 0)
select dateadd(mi, datediff(mi, 0, getdate()), 0)
Arrondi à la seconde nécessite une approche différente, puisque le nombre de secondes depuis 0
donne un débordement. Une solution consiste à utiliser le début de la journée, au lieu de 1900, comme date de référence :
declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(s, datediff(s, @start_of_day, getdate()), @start_of_day)
Pour arrondir par 5 minutes , ajustez la méthode d'arrondi des minutes. Prenez le quotient de la différence minute, par exemple en utilisant /5*5
:
select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)
Cela fonctionne également pour les quarts et demi-heures.