Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Quelle est la meilleure façon de tronquer une date dans SQL Server ?

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.