如何在 Access SQL 中使用 BETWEEN 和 AND 来过滤日期范围?
Posted
技术标签:
【中文标题】如何在 Access SQL 中使用 BETWEEN 和 AND 来过滤日期范围?【英文标题】:How do I use BETWEEN and AND in Access SQL to filter on a date range? 【发布时间】:2020-02-03 21:32:35 【问题描述】:我使用的 Access 数据库具有表 Visits
和字段 VisitDate
,其值存储为字符串(例如 01/21/2020
)。我需要使用1/20/2020
和1/26/2020
之间的VisitDate
字段值提取所有记录。在过去五天解决这个问题之后,我能做的最好的事情是......
dim WHEREclause as string = " WHERE VisitDate BETWEEN " & ccc & " AND " & ddd
其中ccc
是"01/20/2020"
,ddd
是"01/26/2020"
。这为我提供了 2020 年的正确记录,但它也返回了 2019 年同一时间段的记录。如何解决此问题?
【问题讨论】:
使用参数避免sql注入和格式化错误。 将日期存储为日期/时间,而不是字符串(如果您希望它工作,那就是)。 这是一场多么彻底的灾难。如果可以避免日期,则永远不应将其存储为文本,但如果是,则应以“字母”顺序与时间顺序匹配的格式存储,这通常表示“yyyy-MM-dd”。就目前而言,您不能在此数据上使用BETWEEN
,因为这将创建一个按字母顺序排列的分区,而不是按时间顺序排列的分区。您可以做的是将列值转换为实际日期,例如WHERE CDATE(VisitDate) BETWEEN
。我不确定语法是否正确,但您可以检查一下。
【参考方案1】:
结合@LarsTech 和@jmcilhinney 的cmets。使用参数并将字符串字段转换为真实日期。
Private Sub OPCode(ccc As String, ddd As String)
Dim dt As New DataTable
Using cn As New OleDbConnection("Your connection string"),
cmd As New OleDbCommand("Select * From Visits WHERE CDate(VisitDate) BETWEEN @FirstDate AND @SecondDate;")
cmd.Parameters.Add("FirstDate", OleDbType.Date).Value = CDate(ccc)
cmd.Parameters.Add("SecondDate", OleDbType.Date).Value = CDate(ddd)
dt.Load(cmd.ExecuteReader)
End Using
DataGridView1.DataSource = dt
End Sub
请注意,对于 Access,参数的名称无关紧要。参数在sql语句中出现的顺序必须与参数添加到Parameters集合的顺序相匹配。为了便于阅读,我使用描述性名称。
【讨论】:
【参考方案2】:用#来做
dim WHEREclause as string = " WHERE VisitDate BETWEEN #" & ccc & "# AND #" & ddd & "#"
nb:小心串接字符串,它有利于 sql 注入
【讨论】:
我没有测试过,但我怀疑这会导致数据类型不匹配,因为VisitDate
不是日期。也许会执行隐式转换,但我不确定我是否会依赖它。以上是关于如何在 Access SQL 中使用 BETWEEN 和 AND 来过滤日期范围?的主要内容,如果未能解决你的问题,请参考以下文章
传递查询如何在Access中使用SQL Server数据库引擎进行查询
传递查询如何在Access中使用SQL Server数据库引擎进行查询
如何使用 SQL 在 MS Access 数据库中“显示表”?