web-dev-qa-db-fra.com

Arrondir la dateheure 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 à 17 heures, il extraira les enregistrements entre le 12/12/2011 de 17h et le 18/12/2011 à 17h00. Comment puis-je obtenir des records pour l'ensemble du 12/12/2011 - 18/12/2011, en gros, ignorer le temps.

Mon script:

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

Dans SQL Server 2008 et versions ultérieures, vous pouvez convertir le DateTime en un Date, ce qui supprime l'élément time.

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)
101
DaveShaw

Voici la chose la plus simple que j'ai trouvée

-- Midnight floor of current date

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

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

Étant donné que DateDiff renvoie un entier, vous pouvez utiliser les jours add-and-retract pour obtenir le bon décalage.

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

Ce n’est pas arrondi, c’est tronquant ... Mais je pense que c’est ce qui est demandé. (Pour arrondir ajouter un et tronquer ... et ce n'est pas arrondir non plus, que le plafond, mais encore probablement ce que vous voulez. Pour arrondir vraiment ajouter. 5 (ça marche?) Et tronquer.

Il se trouve que vous pouvez ajouter .5 à GetDate () et que 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.

46
Darrel Lee
--
-- SQL DATEDIFF getting midnight time parts 
--
SELECT GETDATE() AS Now, 
   Convert(DateTime, DATEDIFF(DAY, 0, GETDATE())) AS MidnightToday,
   Convert(DateTime, DATEDIFF(DAY, -1, GETDATE())) AS MidnightNextDay,
   Convert(DateTime, DATEDIFF(DAY, 1, GETDATE())) AS MidnightYesterDay
go
Now                   MidnightToday          MidnightNextDay        MidnightYesterDay     
 --------------------  ---------------------  ---------------------  --------------------- 
 8/27/2014 4:30:22 PM  8/27/2014 12:00:00 AM  8/28/2014 12:00:00 AM  8/26/2014 12:00:00 AM 
7
edvox1138
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

4
Jeremy Atkinson

Essayez d'utiliser ceci.

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

Comme @BassamMehanni l'a mentionné, vous pouvez utiliser le format DATE dans SQL Server 2008 et les versions suivantes ...

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

La deuxième condition peut en réalité n'être que GetDate(), mais je présente ce format comme exemple de Less Than DateX Pour éviter de devoir également convertir le champ dateField en DATE, ce qui améliore considérablement les performances.


Si vous êtes sur 2005 ou moins, vous pouvez utiliser cette ...

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

Cela peut sembler bon marché mais cela fonctionne pour moi

SELECT CONVERT (DATETIME, LEFT (CONVERT (VARCHAR, @ dateFieldOrVariable, 101), 10) + '00: 00: 00.000')

1
Jean-Louis Gervais

Je fais habituellement

SELECT *
FROM MyTable
WHERE CONVERT(VARCHAR, MyTable.dateField, 101) = CONVERT(VARCHAR, GETDATE(), 101)

si vous utilisez SQL SERVER 2008, vous pouvez faire

SELECT *
FROM MyTable
WHERE CAST(MyTable.dateField AS DATE) = CAST(GETDATE() AS DATE)

J'espère que cela t'aides

0
Bassam Mehanni

Vous pouvez arrondir le temps.

Utiliser ROUND ci-dessous l’arrondira à minuit.

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >  CONVERT(datetime, (ROUND(convert(float, getdate()-6.5),0)))
0
ChrisM