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