Arrondir SQL DateTime à 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 tirer les records entre 12/12/2011 17h et 18/12/2011 17h. Comment puis-je lui faire remonter les dossiers pour l'set de l'set 12/12/2011 – 12/18/2011 ignorer le time.

Mon script:

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

    Dans SQL Server 2008 et plus récent, vous pouvez convertir le DateTime en Date , ce qui supprime l'élément de time.

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

    Dans SQL Server 2005 et ci-dessous, vous pouvez utiliser:

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

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

     -- Midnight floor of current date SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE())) 

    Le DATEDIFF renvoie le integer de jours avant ou depuis 1900-1-1, et le Convertir Datetime le rapproche obligatoirement à cette date à minuit.

    Puisque DateDiff renvoie un integer, vous pouvez utiliser append ou soustraire des jours pour get le bon décalage.

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

    Ce n'est pas arrondir c'est tronquer … Mais je pense que c'est ce qui est demandé. (Pour arrondir en append un et tronquer … et ce n'est pas arrondir non plus, que le plafond, mais encore une fois très probablement ce que vous voulez. Pour vraiment arrondir append .5 (cela fonctionne-t-il?) Et tronquer.

    Il s'avère que vous pouvez append .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.

     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

     -- -- 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 

    Comme l'a mentionné @BassamMehanni, vous pouvez diffuser en tant que DATE dans 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 simplement GetDate() , mais je montre ce format comme un exemple de Less Than DateX pour éviter d'avoir à lancer le champ dateField à une date, améliorant ainsi considérablement les performances.

    Si vous êtes en 2005 ou en dessous, vous pouvez l'utiliser …

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

    Essayez d'utiliser ceci.

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

    Cela peut sembler pas cher mais ça marche pour moi

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

    Je fais habituellement

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

    Si vous utilisez SQL Server 2008, vous pouvez le faire

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

    J'espère que cela t'aides