2011-08-08 2 views
0

En ce moment je suis en utilisant cette commande pour récupérer tous les champs de la journée en cours:SQL Server 2005 sélectionnez les champs à partir d'un certain laps de temps

SELECT COUNT(*) 
FROM [SecureOrders] 
WHERE DateTime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 
     AND 
     DateTime < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 1) 

Cependant, je veux être en mesure d'obtenir les champs qui étaient entré entre midi hier et midi aujourd'hui - comment puis-je faire cela?

Répondre

2

0,5 midi (par exemple une demi-journée)

WHERE DateTime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), -0.5) 
     AND 
     DateTime < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0.5) 
0
DECLARE @NoonToday DATETIME; 

SET @NoonToday = DATEADD(HOUR, 12, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)); 

SELECT COUNT(*) FROM [SecureOrders] 
WHERE [DateTime] >= DATEADD(DAY, -1, @NoonToday) 
AND [DateTime] < @NoonToday; 
0

il peut sembler laid, mais devrait fonctionner

SELECT 
    COUNT(*) 
FROM 
    [SecureOrders] 
WHERE 
    DateTime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) - 0.5 AND DateTime < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 1) + 0.5 
+1

Je recommande de rester loin des opérations d'addition/soustraction implicites pour les types date/heure. Ils fonctionnent correctement dans SQL Server 2005, mais ils ne sont pas compatibles avec les nouveaux types dans SQL Server 2008 (ce qui, imaginons-le, permettra à de nombreuses personnes de migrer vers une nouvelle version en 2005). C'est un peu plus typé, mais DATEADD est à la fois plus compatible avec l'avant et l'intention est beaucoup plus claire. –

+0

convenu. Laissons cette réponse en vie pour empêcher d'autres de l'utiliser comme la solution pour SQL Server 2008 (et plus je crois) – heximal

0

Une variante de solution de @Aaron Bertrand, sans déclarer une variable et sans traiter une valeur entière non nulle comme une date:

SELECT COUNT(*) 
FROM SecureOrders o 
    CROSS JOIN (
    SELECT DATEADD(HOUR, DATEDIFF(DAY, 0, GETDATE()) * 24 + 12, 0) 
) AS d (TodayNoon) 
WHERE o.DateTime < d.TodayNoon 
    AND o.DateTime >= DATEADD(DAY, -1, d.TodayNoon) 
+0

Je ne vois pas le problème avec l'un de vos commentaires, mais d'accord. Je ne trouve pas non plus un 'CROSS JOIN' plus facile à comprendre ... mais tout ce qui flotte votre bateau. :-) –

+0

L'idée de ne pas utiliser un entier comme date n'est pas de faire des suppositions sur la représentation interne des horodatages. La seule exception est zéro, qui est utilisé pour l'arrondi: cette solution suppose que 0 représente un horodatage qui pointe au début d'un jour (quel que soit ce jour). Je pensais que cela pourrait être plus cohérent avec ce que vous avez dit dans un commentaire à la question de heximal de rester loin des opérations implicites aux dates. C'est à dire. Ici, j'évite non seulement les additions/soustractions implicites, mais aussi les conversions implicites. :) –

+0

AFAIK 'CONVERT (DATETIME, DATEDIFF (JOUR, 0, CURRENT_TIMESTAMP))' est le même que 'DATEADD (JOUR, 0, DATEDIFF (JOUR, 0, CURRENT_TIMESTAMP))' - le premier est effectué dès que vous effectuez un autre 'DATEADD'. Je comprends ce que vous voulez dire, mais les trucs de maths entiers se cassent * maintenant * dans SQL Server 2008; la méthode que j'ai montré fonctionne très bien même dans Denali CTP3 - un exemple artificiel: 'SELECT CONVERT (DATETIME2 (7), DATEADD (HEURE, 5, DATEDIFF (JOUR, 2, CURRENT_TIMESTAMP)));' ... également pas sûr de ce qui est mal à l'aide d'une variable, je trouve qu'il aide les nouveaux gens à décomposer les choses et à mieux comprendre les pièces. –

Questions connexes