You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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点),时间精度支持到秒级以下。

  1. 仅传入MM/dd/yyyy格式的日期做等值匹配时,Access会将该值解析为查询日期当天的0点0分0秒,仅能匹配到刚好在0点整写入的记录,所有带非0时间值的记录都不会被命中。
  2. 手动拼接HH:mm:ss时间格式仍无返回,是因为传入的时间值和数据库实际存储的时间精度不匹配,哪怕存在毫秒级偏差,等值判断都会判定为不相等。
  3. 你之前使用的区间查询写法本身也存在数据遗漏: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:30:54