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)
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)
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.
--
-- 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
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
Essayez d'utiliser ceci.
WHERE Orders.OrderStatus = 'Shipped'
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())
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)
Cela peut sembler bon marché mais cela fonctionne pour moi
SELECT CONVERT (DATETIME, LEFT (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 faire
SELECT *
FROM MyTable
WHERE CAST(MyTable.dateField AS DATE) = CAST(GETDATE() AS DATE)
J'espère que cela t'aides
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)))