如何在 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/20201/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语句中如何创建表?

传递查询如何在Access中使用SQL Server数据库引擎进行查询

传递查询如何在Access中使用SQL Server数据库引擎进行查询

如何使用 SQL 在 MS Access 数据库中“显示表”?

如何在 Access 查询中显示行号,如 SQL 中的 ROW_NUMBER

如何使用 SQL 在 Microsoft Access 2013 中创建查找字段?