2010-10-29 6 views
1

Pourquoi ai-je des données '2009'? Qu'est-ce que je fais de mal avec la clause WHERE?SQL BETWEEN Opérateur

SELECT CONVERT(varchar, EventDate, 101) AS EVENTDATE, 
     CONVERT(varchar, ClosedDate, 101) AS CLOSEDDATED, 
     DATEDIFF(Day,EventDate,ClosedDate) AS DiffDate, 
    FROM mytable 
WHERE (CONVERT(varchar, EventDate, 101) BETWEEN '04/01/2010' AND '04/30/2010') 
+0

@OMG comment faire Didja dat? – Yves

+1

Sélectionnez le texte que vous voulez être le code, puis cliquez sur le "code exemple" bouton au-dessus de l'éditeur de texte (ressemble à 1 et 0). – FrustratedWithFormsDesigner

Répondre

11

Vous effectuez une comparaison de chaînes, qui va de gauche à droite. '04/10/2009' se situe entre '04/0 'et '04/3'.

Si le champ que vous comparez est DATETIME, n'essayez pas de le convertir. Le serveur SQL peut convertir les chaînes en dates et effectuer la comparaison correctement.

+0

Merci Mark. Toutes les réponses sont bonnes mais c'est le meilleur post. – Yves

5

Si vous utilisez un format de date pris en charge, SQL Server convertir implicitement la chaîne à un DATETIME:

SELECT CONVERT(varchar, EventDate, 101) AS EVENTDATE, 
     CONVERT(varchar, ClosedDate, 101) AS CLOSEDDATED, 
     DATEDIFF(Day,EventDate,ClosedDate) AS DiffDate, 
    FROM mytable 
WHERE EventDate BETWEEN '2010-04-01' AND '2010-04-30' 

Votre requête est simplement en train de faire la comparaison de chaînes, ce qui n'a aucune incidence sur des portées de date.

+0

u r mon héros: 0). 10-q – Yves

0

Votre clause WHERE peut faire une comparaison de chaîne au lieu d'une comparaison de date. Si vous voulez faire une comparaison de date, vous pouvez modifier

CONVERT(varchar, EventDate, 101) 

à

CAST (CONVERT(varchar, EventDate, 101) AS DATETIME) 
0

Vous avez vraiment pas besoin de toute la conversion. Les dates du calendrier auront les bonnes heures de début et de fin. Vous souhaitez également prendre en compte les événements susceptibles de dépasser la date de fin ou commencer avant la date et se terminer dans la plage de dates. Ou enfin commencer avant et passer devant ...

Voici quelques code que nous utilisons

(EventStartDtTm >= startDt and EventStartDtTm <= endDt) 
|| (EventStartDtTm <= startDt and EventEndDtTm >= startDt) 

- patrick