在 ms access 2010 数据库中的 Select 查询中使用 Between 时遇到问题

Trouble using Between in Select query in ms access 2010 database

早上好,有人可以帮我解决这个 SELECT 查询吗?我有一个表单 (frm_Reports),上面有两个文本框(Text98 和 Text100 都格式化为采用 ShortDate)和一个按钮 (RunReport)。用户在 Text98 中输入开始日期,在 Text100 中输入结束日期,然后单击 RunReport 按钮。来自 Text98 和 Text100 的日期存储在变量中作为 Dates(称为 stardate 和 enddate)然后 SELECT 查询(见下面的代码)意味着 运行 检索 [=30= 中的所有记录] (tbl_details) 的条目日期(在标题为 DateTime 的列下)介于用户输入的开始日期和结束日期之间。问题是我无法使 SELECT 查询正常工作。

我不擅长 sql 类型语句,所以我尝试构建我的查询字符串,每次测试它。我已经成功地做到了这一点:

sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) > #" & startdate & "#;"

但是,当我尝试将此字符串转换为 BETWEEN 类型查询时,我得到

"Run-time Error '13': Type mismatch.

    Private Sub RunReport_Click()

    Dim selectedreport As String
    Dim startdate As Date
    Dim enddate As Date
    Dim sqlstr As String

    selectedreport = Me.ComboReport.Column(1)
    startdate = Me.Text98
    enddate = Me.Text100
    'sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) > #28/04/2019#;" - THIS WORKS
    'sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) > #" & startdate & "#;" - THIS WORKS
    sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) BETWEEN #" & startdate & "#" And "#" & enddate & "#;" 'THIS DOES NOT WORK

    Dim dbs As Database
    Dim rst As Recordset

    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset(sqlstr)
    With rst
        While Not .EOF()
        vName = .Fields("DateTime").Value
        Debug.Print vName

    .MoveNext
    Wend
    End With

    dbs.Close

    End Sub

如果有人能告诉我这个陈述哪里出了问题,并提出一个切实可行的建议,我将不胜感激。谢谢

从 VBA 生成 SQL 时,最初 Debug.Print 始终是 SQL 的理想选择。在这种情况下,似乎您甚至无法做到这一点,因为您错误地构建了 SQL 字符串--- And 需要在引号内:

sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) BETWEEN #" & startdate & "# And #" & enddate & "#;"
' instead of this:
sqlstr = "SELECT * FROM tbl_details WHERE (tbl_details.DateTime) BETWEEN #" & startdate & "#" And "#" & enddate & "#;"

其他几点:

  • 如果您的 DateTime 列包含时间,您需要稍微更改一下代码。如果用户输入 2019-05-03 作为结束日期,5 月 3 日的值将被排除(例如 2019-05-03 15:00)。
  • DateTime 是一个错误的列名,因为它没有描述您的数据。您可能还想考虑重命名 tbl_details。详细什么?
  • 您还应该继续为您的文本框命名。 txtStartDate 而不是 Text98.
  • 在声明dbsrst时,最好添加库(例如Dim dbs as DAO.Database),因为ADO和DAO库都使用相同的类。
  • 除了在 VBA 中硬编码 SQL,您还可以使用参数化查询,这样您就不必生成 SQL(可以是有时很棘手)。

考虑使用 QueryDefs 的参数化查询,并根据数据类型避免任何混乱的串联或 quote/symbol 附件。然后将表单值绑定到 querydef 对象并将 querydef 分配给记录集对象。

SQL (下面保存为存储查询对象)

PARAMETERS [param_start] Date, [param_end] Date;
SELECT * FROM tbl_details 
WHERE (tbl_details.DateTime) BETWEEN [param_start] AND [param_end]

VBA (绑定查询参数到报表的记录集)

Private Sub RunReport_Click()
    Dim qdef As QueryDef
    Dim rst As Recordset
    Dim selectedreport As String

    ' OPEN QUERY AND BIND PARAMS 
    Set qdef = CurrentDb.QueryDefs("mySavedParamQuery")

    qdef!start_param = Me.Text98
    qdef!end_param = Me.Text100

    ' ASSIGN QUERY RESULT TO RECORDSET
    Set rst = qdef.OpenRecordset()    

    With rst
        While Not .EOF()
            Debug.Print .Fields("DateTime").Value
            .MoveNext
        Wend
    End With

    Set qdef = Nothing    
    Set rst = Nothing
End Sub