C# C即使日期在日期范围内,也无法显示数据

C# C即使日期在日期范围内,也无法显示数据,c#,sql,ms-access,C#,Sql,Ms Access,我使用C窗口应用程序从MicrosoftAccess中提取数据,使用SQL查询进行一些检查 我有两个表要比较和选择数据 表1:用户运行的用户运行,包括开始日期和结束日期 表2:USERINFO,我需要将其与表1连接并拉入 在StartDate和EndDate表的日期范围内的数据。 如果我的表1的开始日期和结束日期设置为2016年1月1日至2017年12月31日,则所有数据都是正确的。但当范围设置为例如2016年12月22日至2017年12月31日,我想要提取的数据是从2017年1月3日开始的,该

我使用C窗口应用程序从MicrosoftAccess中提取数据,使用SQL查询进行一些检查

我有两个表要比较和选择数据

表1:用户运行的用户运行,包括开始日期和结束日期 表2:USERINFO,我需要将其与表1连接并拉入 在StartDate和EndDate表的日期范围内的数据。 如果我的表1的开始日期和结束日期设置为2016年1月1日至2017年12月31日,则所有数据都是正确的。但当范围设置为例如2016年12月22日至2017年12月31日,我想要提取的数据是从2017年1月3日开始的,该日期介于日期范围之间,但不知何故,数据是空的

我好奇的是,我的查询是错误的,或者我遗漏了一些语法

以下是我的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'

如果您觉得无法减少查询以进行调试,至少要正确设置日期部分:

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中。

您的查询在这样一行中是无法读取的,即使它不是,也比需要的复杂得多。请将此问题简化为最小查询。您是否尝试过在没有连接的情况下进行查询?我感觉您正在将日期存储为字符串。我说的对吗?正如Steve所暗示的,将日期存储为字符串是一个非常非常糟糕的主意——特别是考虑到你没有按可排序的顺序存储它们!从词汇上讲,字符串01/01/2020出现在2016年1月10日之前——但你不希望这样……再加上@JonSkeet所说的,如果你将日期存储为字符串,那么你应该在比较之前将它们转换为日期them@MarcusZac:嗯,正是这样-与字符串abc位于bcd之前的方式相同。在比较字符串时,基本上先看第一个字符。。。“0”在“1”之前。这比这要复杂一点,但从根本上看,这说明了问题所在。