96 votes

Arrondir une date-heure SQL à minuit

J'ai un petit problème avec ma requête SQL. J'utilise la fonction GETDATE, cependant, disons que j'exécute le script à 17h, il va extraire les enregistrements entre le 12/12/2011 17h et le 18/12/2011 17h. Comment puis-je faire en sorte qu'il trouve des enregistrements pour toute la période du 12/12/2011 au 18/12/2011, sans tenir compte du temps.

Mon script :

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate > (GETDATE()-6)

129voto

DaveShaw Points 19555

Dans SQL Server 2008 et les versions plus récentes, vous pouvez lancer l'option DateTime à un Date ce qui supprime l'élément temporel.

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= (cast(GETDATE()-6 as date))  

Dans SQL Server 2005 et inférieur, vous pouvez utiliser :

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= DateAdd(Day, Datediff(Day,0, GetDate() -6), 0)

1 votes

J'ai obtenu ce type de date n'est pas un type de système défini.

2 votes

Je suppose que vous n'utilisez pas SQL 2008 alors :)

0 votes

@user1090389 c'est pourquoi j'ai mis l'option de conversion de chaîne ;D

64voto

Darrel Lee Points 226

Voici la solution la plus simple que j'ai trouvée.

-- Midnight floor of current date

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))

Le DATEDIFF renvoie le nombre entier de jours avant ou depuis 1900-1-1, et la fonction Convert Datetime la ramène obligeamment à cette date à minuit.

Comme DateDiff renvoie un nombre entier, vous pouvez ajouter ou soustraire des jours pour obtenir le bon décalage.

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()) + @dayOffset)

Ce n'est pas un arrondi, c'est une troncature... Mais je pense que c'est ce qui est demandé. (Pour arrondir, ajouter un et tronquer...et ce n'est pas un arrondi non plus, c'est le plafond, mais Encore une fois, c'est probablement ce que vous voulez. Pour vraiment arrondir, ajoutez .5 (est-ce que ça marche ?) et tronquez.

Il s'avère que vous pouvez ajouter .5 à GetDate() et cela fonctionne comme prévu.

-- Round Current time to midnight today or midnight tomorrow

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))

J'ai fait tous mes essais sur SQL Server 2008, mais je pense que ces fonctions s'appliquent également à 2005.

0 votes

Cela fonctionne dans 2k5, je viens de le tester. where [ScanDate] >= convert(datetime, datediff(day, 0, getdate())) and [ScanDate] < convert(datetime, datediff(day, -1, getdate()))

5voto

Jeremy Atkinson Points 96
SELECT getdate()

Résultat : 2012-12-14 16:03:33.360

SELECT convert(datetime,convert(bigint, getdate()))

Résultat 2012-12-15 00:00:00.000

1 votes

Merci pour les commentaires. Ce que j'essayais de souligner, c'est que la conversion en bigint et le retour font l'arrondi pour vous.

2 votes

Ce code arrondit à minuit à la fin de la journée si l'heure est postérieure à midi, ce qui entraîne une erreur pendant la moitié de la journée.

0 votes

L'utilisation de cette méthode peut avoir un impact sur les performances plus tard avec des ensembles de données plus importants.

3voto

MatBailie Points 37610

Comme @BassamMehanni l'a mentionné, vous pouvez exprimer en tant que DATE à partir de SQL Server 2008...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= CAST(GetDate() - 6 AS DATE)
  AND dateField <  CAST(GetDate() + 1 AS DATE)

La deuxième condition peut en fait être juste GetDate() mais je montre ce format comme un exemple de Less Than DateX pour éviter de devoir convertir le champ dateField en DATE, ce qui améliore considérablement les performances.

Si vous êtes en 2005 ou moins, vous pouvez utiliser ce...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) - 6, 0)
  AND dateField <  DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) + 1, 0)

3voto

UttamG Points 1

Essayez d'utiliser ceci.

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X