C#操作Access数据库SQL查询单日期记录无结果问题求解
Access数据库单日期等值查询无返回结果问题说明
问题复现
- 日期区间查询可正常返回结果,对应SQL:
"SELECT DISTINCT ID_1 as SampleID, ID_2 as TestID FROM Results WHERE TestDate Between #" + startDate.ToString("MM/dd/yyyy") + "# AND #" + endDate.ToString("MM/dd/yyyy") + "#"
- 改为单日期等值查询时,无论是否拼接
HH:mm:ss格式的时间部分,都返回0条记录,对应SQL:
"SELECT DISTINCT ID_1 as SampleID, ID_2 as TestID FROM Results WHERE TestDate = #" + startDate.ToString("MM/dd/yyyy") + "#";
问题根因
Access的日期/时间字段底层以双精度浮点数存储:整数部分代表距离1899-12-30的天数,小数部分代表当天的时间偏移(0对应0点,1对应次日0点),时间精度支持到秒级以下。
- 仅传入
MM/dd/yyyy格式的日期做等值匹配时,Access会将该值解析为查询日期当天的0点0分0秒,仅能匹配到刚好在0点整写入的记录,所有带非0时间值的记录都不会被命中。 - 手动拼接
HH:mm:ss时间格式仍无返回,是因为传入的时间值和数据库实际存储的时间精度不匹配,哪怕存在毫秒级偏差,等值判断都会判定为不相等。 - 你之前使用的区间查询写法本身也存在数据遗漏:
Between #起始日期# AND #结束日期#在传入不带时间的日期值时,查询范围是起始日期0点到结束日期0点,结束日期当天0点之后的所有记录都不会被返回,只是此前未被发现。
修正方案
查询单日期所有记录时,不要使用等值匹配,改用范围查询覆盖目标日期全天的时间范围,无需关心字段内存储的具体时间值:
"SELECT DISTINCT ID_1 as SampleID, ID_2 as TestID FROM Results WHERE TestDate >= #" + startDate.ToString("MM/dd/yyyy") + "# AND TestDate < #" + startDate.AddDays(1).ToString("MM/dd/yyyy") + "#"
该写法的查询范围是目标日期0点至次日0点之前的所有记录,既可以覆盖全天所有时间点的条目,也能规避时间精度不匹配导致的查询失败问题。
内容的提问来源于stack exchange,提问作者ScottinTexas
相关产品推荐
相关产品推荐

