在C#中查询Access数据库日期区间数据无结果的问题
解决Access数据库日期区间查询无结果的问题
嘿,我来帮你搞定这个查询没结果的问题!你遇到的核心问题其实是Access SQL对日期常量的语法要求,还有可能的日期格式/字段类型问题,我一步步给你拆解:
1. Access日期常量的正确写法
Access的SQL里,日期值不能用单引号'包裹——单引号是给字符串用的!正确的做法是用**井号#**来标记日期常量。你之前的语句用了单引号,Access会把这些日期当成字符串来比较,而不是日期类型,自然匹配不到正确的结果。
修正后的两条SQL应该是这样:
大于/小于的写法
SELECT * FROM tbl_daryaft WHERE (date1 > #1396/12/1#) AND (date1 < #1396/12/25#)
BETWEEN的写法
SELECT * FROM tbl_daryaft WHERE date1 BETWEEN #1396/12/1# AND #1396/12/25#
2. 更可靠的方案:C#中使用参数化查询
直接写硬编码的日期字符串容易踩格式坑,而且还有SQL注入风险。在C#里用参数化查询是更稳妥的做法,数据库会自动处理日期类型的转换,不用纠结符号和格式:
using System.Data.OleDb; using System.Globalization; // 假设你的Access连接字符串 string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\YourDatabase.accdb;"; string sql = "SELECT * FROM tbl_daryaft WHERE date1 > @StartDate AND date1 < @EndDate"; using (OleDbConnection conn = new OleDbConnection(connString)) { conn.Open(); using (OleDbCommand cmd = new OleDbCommand(sql, conn)) { // 用波斯历创建DateTime对象 PersianCalendar persianCal = new PersianCalendar(); DateTime startDate = persianCal.ToDateTime(1396, 12, 1, 0, 0, 0, 0); DateTime endDate = persianCal.ToDateTime(1396, 12, 25, 0, 0, 0, 0); // 添加参数 cmd.Parameters.AddWithValue("@StartDate", startDate); cmd.Parameters.AddWithValue("@EndDate", endDate); // 执行查询并处理结果 using (OleDbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // 读取数据,比如 reader["date1"] 等 } } } }
3. 额外排查点
如果改了语法还是没结果,你可以检查这两点:
- 字段类型:确认
date1字段是Access里的「日期/时间」类型,而不是「文本」类型。如果是文本,字符串比较的规则和日期完全不同,比如'1396/12/5'会比'1396/12/10'大,因为字符串是按字符逐个比的。 - 日期格式一致性:如果字段确实是文本类型(不推荐),要确保你查询的日期格式和存储的完全一致,比如存储的是
'1396-12-01',你用'1396/12/1'就匹配不上。
内容的提问来源于stack exchange,提问作者AmirMohamamd
相关产品推荐
相关产品推荐

