2017-01-05 6 views
-1

SQL照会を使用してMicrosoft Accessからデータを取得するためにC#Windowアプリケーションを使用しています。C#日付が日付範囲内であってもデータを表示できません

私は2つのテーブルを比較し、データを選択しました。

  • 表1:USER_OF_RUN開始日と終了日
  • 表2から成る:USERINFO iは、表1と結合し、開始日と終了日テーブルの日付範囲に データを取得する必要があります。

私の表1の開始日と終了日が2016年1月1日から31/12/2017に設定されている場合は、すべてのデータが正確です。しかし、範囲がたとえば22/12/2016から31/12/2017のように設定され、プルしたいデータが日付3/1/2017のデータである場合、日付範囲の間に入りますが、どういうわけかデータ空だった。

私は気になっているのは、クエリが間違っているか、いくつかの構文がありません。ここで

は私のSQLクエリです:

SELECT 
    FORMAT(A.CHECKTIME,'dd/mm/yyyy') AS CHECKTIME, 
    A.USERID AS USERID, 
    B.NAME AS NAME, 
    B.BADGENUMBER AS BADGENUMBER, 
    C.NUM_OF_RUN_ID, 
    D.NAME AS DEPT, 
    DEFAULTDEPTID 
FROM ((((CHECKINOUT A) 
    LEFT JOIN USERINFO B 
     ON A.USERID = B.USERID) 
    LEFT JOIN USER_OF_RUN C 
     ON A.USERID = C.USERID) 
    LEFT JOIN NUM_RUN D 
     ON C.NUM_OF_RUN_ID = D.NUM_RUNID) 
WHERE 
    Format(A.CHECKTIME, 'dd/mm/yyyy') IN (Format('03/01/2017', 'dd/mm/yyyy'), Format(DateAdd('d', 1, Format('03/01/2017', 'dd/mm/yyyy')), 'dd/mm/yyyy')) 
    AND Format('03/01/2017', 'dd/mm/yyyy') BETWEEN Format(C.STARTDATE, 'dd/mm/yyyy') AND Format(C.ENDDATE, 'dd/mm/yyyy') 
    AND DEFAULTDEPTID = 4 
    AND BADGENUMBER = '7092' 
ORDER BY A.USERID DESC, CHECKTIME asc 

UNION ALL 

SELECT 
    distinct '', 
    USERID, 
    NAME, 
    BADGENUMBER, 
    '', 
    '', 
    '' 
FROM USERINFO 
WHERE userid NOT IN 
    (SELECT DISTINCT A.USERID AS USERID 
    FROM ((((CHECKINOUT A) 
     LEFT JOIN USERINFO B 
      ON A.USERID = B.USERID) 
     LEFT JOIN USER_OF_RUN C 
      ON A.USERID = C.USERID) 
     LEFT JOIN NUM_RUN D 
      ON C.NUM_OF_RUN_ID = D.NUM_RUNID) 
    WHERE Format (A.CHECKTIME, 'dd/mm/yyyy') = Format('03/01/2017', 'dd/mm/yyyy') 
     AND Format('03/01/2017', 'dd/mm/yyyy') BETWEEN Format(C.STARTDATE, 'dd/mm/yy') AND Format(C.ENDDATE, 'dd/mm/yyyy')) 
     AND DEFAULTDEPTID = 4 
     AND BADGENUMBER = '7092' 
+0

あなたのクエリは、そのような1行では判読できません。そうでない場合でも、必要以上に複雑です。これを* minimal *クエリに減らしてください。 (参加しないでクエリを試してみましたか?) –

+0

私はあなたの日付を文字列として保存しているという印象を受けています。私は正しい? – Steve

+0

@JonSkeet提案してくれてありがとう、私はコードを編集していた。今すぐもっと見ることができますか? –

答えて

0

あなたは、少なくとも日付の部分が権利を取得、あなたはそれをデバッグするためのクエリを減らすことができます感じていない場合は、次の

SELECT 
    A.CHECKTIME, 
    A.USERID, 
    B.NAME, 
    B.BADGENUMBER, 
    C.NUM_OF_RUN_ID, 
    D.NAME AS DEPT, 
    DEFAULTDEPTID 
FROM ((((CHECKINOUT A) 
    LEFT JOIN USERINFO B 
     ON A.USERID = B.USERID) 
    LEFT JOIN USER_OF_RUN C 
     ON A.USERID = C.USERID) 
    LEFT JOIN NUM_RUN D 
     ON C.NUM_OF_RUN_ID = D.NUM_RUNID) 
WHERE 
    A.CHECKTIME = #2017/01/03# 
    AND 
    #2017/01/03# BETWEEN C.STARTDATE AND C.ENDDATE 
    AND 
    DEFAULTDEPTID = 4 
    AND 
    BADGENUMBER = '7092' 
ORDER BY A.USERID DESC, A.CHECKTIME ASC 

UNION ALL 

SELECT 
    DISTINCT 
    '', 
    USERID, 
    NAME, 
    BADGENUMBER, 
    '', 
    '', 
    '' 
FROM USERINFO 
WHERE USERID NOT IN 
    (SELECT DISTINCT A.USERID AS USERID 
    FROM ((((CHECKINOUT A) 
     LEFT JOIN USERINFO B 
      ON A.USERID = B.USERID) 
     LEFT JOIN USER_OF_RUN C 
      ON A.USERID = C.USERID) 
     LEFT JOIN NUM_RUN D 
      ON C.NUM_OF_RUN_ID = D.NUM_RUNID) 
    WHERE 
     A.CHECKTIME = #2017/01/03# 
     AND 
     #2017/01/03# BETWEEN C.STARTDATE AND C.ENDDATE 
     AND 
     DEFAULTDEPTID = 4 
     AND 
     BADGENUMBER = '7092' 

あなたの日付場合フィールドには時刻部分が含まれています。DateValueまたはFixにこれらを囲みます。

関連する問題