2015-07-13 2 views
1
SELECT * 
FROM tblClassAppointments 
INNER JOIN tblClassGroups ON tblClassAppointments.GroupID = tblClassGroups.GroupID 
WHERE (
     ('2015-07-13' >= StartTime) 
     AND ('2015-07-13' <= EndTime) 
     AND ('2015-07-13' > StartTime) 
     AND ('2015-07-13' >= EndTime) 
     ) 
    OR (
     ('2015-07-13' >= StartTime) 
     AND ('2015-07-13' < EndTime) 
     AND ('2015-07-13' > StartTime) 
     AND ('2015-07-13' <= EndTime) 
     ) 
    OR (
     ('2015-07-13' <= StartTime) 
     AND ('2015-07-13' < EndTime) 
     AND ('2015-07-13' >= StartTime) 
     AND ('2015-07-13' <= EndTime) 
     ) 
    OR (
     ('2015-07-13' <= StartTime) 
     AND ('2015-07-13' >= EndTime) 
     ) 

J'utilise la requête ci-dessus pour obtenir des rendez-vous de classe qui sont placés pendant une certaine période. Je dois lancer le StartTime(tblClassAppointments.StartTime) et le EndTime(tblClassAppointments.EndTime) en tant que yyyy-mm-dd.Date de diffusion dans la clause where de la requête

Ce que j'essayé:

J'ai essayé

CONVERT(char(10), StartTime, 126) 

et

CONVERT(char(10), EndTime, 126) 

au lieu de StartTime et EndTime. Il a donné une erreur.

Ce que je dois:

Comment je convertir StartTime et EndTime comme yyyy-mm-dd dans la clause where elle-même? (les deux champs sont dans le type de datetime)

S'il vous plaît me conseiller. Merci

+0

Quelle a été l'erreur que vous avez reçu? – alan

+1

"Il a donné une erreur." Veuillez TOUJOURS ajouter le message d'erreur si vous en avez un. "Cela a donné une erreur" car la seule déclaration est absolument inutile. – waka

+0

Je suis désolé, je comprends mon point faible. J'essaie de récupérer ce message d'erreur. Je vais le poster. Merci d'avoir signalé mes erreurs. –

Répondre

0

Ceci est trop long pour un commentaire et ne répond pas directement à tout problème de mise en forme avec des chaînes. Vos comparaisons de date sont simplement compliquées. Si StartTime et EndTime ont une composante de temps, et vous voulez savoir si l'ensemble jours de « 13/07/2015 » est couvert, utilisez:

WHERE StartTime <= '2015-07-13' and EndTime >= '2015-07-14' 

C'est, le début de la période avant le jour commence et se termine après le début de la journée.

Si vous voulez savoir si une partie la date est couvert:

WHERE StartTime < '2015-07-14' and EndTime >= '2015-07-13' 

C'est, la période commence avant le jour se termine et commence après la journée commence.

Si vous n'aimez pas '2015-07-14' dans la logique, utilisez DATEADD(day, 1, '2015-07-13').

Et, si vous voulez être indépendant des paramètres d'internationalisation, vous pouvez également utiliser CAST('20150714' as DATE).

1

Votre clause WHERE est trop confuse, je ne comprends pas du tout, j'essaierais d'utiliser BETWEEN lorsque cela est possible. Je suis prêt à parier que vous obtenez une erreur de troncature, parce que vous essayez de convertir un datetime type à char(10), ce qui est beaucoup trop petit. Si tout ce qui vous intéresse est la partie date, transtypez/convertissez au type de données DATE.

Voici un exemple d'une façon de le faire:

; with CTE1 as (
    SELECT * 
    , cast(StartTime as date) as StartTime2 
    , cast(EndTime as date) as EndTime2 
    FROM tblClassAppointments 
    INNER JOIN tblClassGroups ON tblClassAppointments.GroupID = tblClassGroups.GroupID 
) 
select * 
from CTE1 
WHERE 
    ('2015-07-13' between StartTime2 and EndTime2) 
OR (
    ('2015-07-13' <= StartTime2) 
    AND ('2015-07-13' < EndTime2) 
    AND ('2015-07-13' >= StartTime2) 
    AND ('2015-07-13' <= EndTime2) 
    ) 
OR (
    ('2015-07-13' <= StartTime2) 
    AND ('2015-07-13' >= EndTime2) 
    )