2013-10-31 19 views
6

Piszę procedurę, w której chcę filtrować datę za pomocą małej daty od daty i daty. od daty może być null kilka razy, a data może być również null w pewnym momencie podczas porównywania, w jaki sposób mogę filtrować datę, kiedy data lub data ważności może być zerowa.porównaj datę z wartościami zerowymi i datetime w serwerze sql

Próbowałem następujące kwerendy, ale daje mi błąd.

SELECT RQ.int_REPS_QUES_DIFF_LEVEL,SUM(1) AS NoOFDificultyQuestion FROM 
REPS_TEST_QUES_ASSIGNED RQA 
INNER JOIN REPS_QUESTION RQ ON RQA.int_REPS_TEST_QUES_ASSG_QUESID=RQ.PK_REPS_QUES_ID 
WHERE int_REPS_TEST_ID IN( 
SELECT FK_TEST_ID FROM STUDENT_EXAM SE WHERE FK_USER_ID=56 AND SE.FK_REPS_BATCH_ID=466 
    and CASE 
WHEN @FromDate!=NULL AND @ToDate!=NULL  
    THEN dat_STUD_EXAM_FINALEND >= @FromDate AND dat_STUD_EXAM_FINALEND <= @ToDate 
WHEN @FromDate!=NULL AND @ToDate=NULL 
    THEN dat_STUD_EXAM_FINALEND >= @FromDate 
WHEN @FromDate=NULL AND @ToDate!=NULL 
    THEN dat_STUD_EXAM_FINALEND <= @ToDate 
END 
) 
strong textGROUP BY RQ.int_REPS_QUES_DIFF_LEVEL 

Dostaję błąd w

THEN dat_STUD_EXAM_FINALEND >= @FromDate AND dat_STUD_EXAM_FINALEND <= @ToDate 

ta linia proszę mi powiedzieć, gdzie jestem coraz źle

Odpowiedz

9

Zamiast

WHEN @FromDate!=NULL AND @ToDate!=NULL 

użytku

WHEN @FromDate IS NOT NULL AND @ToDate IS NOT NULL 

IS [NOT] NULL

Jeśli coś jest NULL to niezdefiniowany w T-SQL, więc nie można porównać z nim. Zarówno =, jak i != uzyskują, 329,, jeśli jedna z wartości (lub obu) wynosi NULL.

+2

pamiętać, że można 'zestaw ANSI_NULLS OFF' aby zmienić zachowanie' = 'tak, że zwraca true przy porównywaniu dowolną wartość NULL przeciwko NULL, a także dokonywanie porównań (' <', '> = ', etc.) PRAWDA przy porównywaniu wartości nie-NULL z NULL. Zobacz [MSDN] (https://msdn.microsoft.com/en-us/library/ms188048.aspx). Pamiętaj, że to ustawienie zostanie usunięte w przyszłej wersji, a jego użycie zdecydowanie nie jest zalecane. – MarioDS

1

Proszę sformatować swoje zapytania. O wiele lepiej jest czytać.

SELECT RQ.int_REPS_QUES_DIFF_LEVEL, 
     SUM(1) AS NoOFDificultyQuestion 
FROM REPS_TEST_QUES_ASSIGNED RQA 
     INNER JOIN REPS_QUESTION RQ 
      ON RQA.int_REPS_TEST_QUES_ASSG_QUESID=RQ.PK_REPS_QUES_ID 
WHERE int_REPS_TEST_ID IN 
     ( 
      SELECT FK_TEST_ID 
      FROM STUDENT_EXAM SE 
      WHERE FK_USER_ID=56 
        AND SE.FK_REPS_BATCH_ID=466 
        AND (
--If both dates are not NULL then also check dat_STUD_EXAM_FINALEND to be between them 
          (@FromDate IS NOT NULL AND @ToDate IS NOT NULL AND dat_STUD_EXAM_FINALEND >= @FromDate AND dat_STUD_EXAM_FINALEND <= @ToDate) 
          OR 
--If @FromDate is not NULL AND @ToDate IS NULL then also check dat_STUD_EXAM_FINALEND to be greater than @FromDate 
          (@FromDate IS NOT NULL AND @ToDate IS NULL AND dat_STUD_EXAM_FINALEND >= @FromDate ) 
          OR 
--If @FromDate is NULL AND @ToDate IS NOT NULL then also check dat_STUD_EXAM_FINALEND to be less than @ToDate 
          (@FromDate IS NULL AND @ToDate IS NOT NULL AND dat_STUD_EXAM_FINALEND <= @ToDate) 

--Having AND in each set makes it impossible two sets to be true at the same time. 
--So If both dates are not null the first set will be evaluated. 
--If @ToDate is NULL, then the first and third sets won't be evaluated as they need @ToDate to be not NULL 
--If @FromDate is NULL, then the first and second sets won't be evaluated as they need @FromDate to be not NULL 
         ) 
     ) strongtext GROUP BY RQ.int_REPS_QUES_DIFF_LEVEL