2013-10-31 14 views
6

私は日付と日付の小さい日付を使用して日付をフィルタリングする手順を書いています。 日付はnullになることがあります。また、To DateはNULLを指定することもできます。 日付を日付または日付にすることができます。日付とnullとdatetime値をSQLサーバーで比較します

私は次のクエリを試しましたが、エラーが発生しました。

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 

私が間違っ

答えて

9

代わりの

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

使用

WHEN @FromDate IS NOT NULL AND @ToDate IS NOT NULL 
を取得しています場所を教えてください。このライン

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

でエラーを取得しています

IS [NOT] NULL

何かがNULLである場合には、T-SQLで未定義あるので、あなたはそれと比較することはできません。 =!=の両方は、両方の(または両方の)値の一方がNULLの場合はfalseとなります。

+2

注意NULL以外の値とNULLを比較する場合[MSDN](https://msdn.microsoft.com/en-us/library/ms188048.aspx)を参照してください。この設定は、将来のバージョンでは削除されることに注意してください。また、その使用方法は絶対に推奨されません。 – MarioDS

1

クエリをフォーマットしてください。それは読書の方がずっと良いです。あなたが `TRUE =`それはNULLに対して任意のNULL値を比較するときにtrueを返す、とも比較を行うように( `<`, `> =`など) `の動作を変更するANSI_NULLS OFF`を設定することができ

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 
関連する問題