繁体   English   中英

在 ms access 2010 数据库中使用选择查询之间的问题

[英]Trouble using Between in Select query in ms access 2010 database

早上好,有人可以帮我让这个 SELECT 查询工作吗? 我有一个表单 (frm_Reports),上面有两个文本框(Text98 和 Text100 都格式化为采用 ShortDate)和一个按钮(RunReport)。 用户在 Text98 中输入开始日期,在 Text100 中输入结束日期,然后单击 RunReport 按钮。 来自 Text98 和 Text100 的日期作为日期(称为 stardate 和 enddate)存储在变量中,然后一个 SELECT 查询(见下面的代码)用于检索表 (tbl_details) 中具有条目日期(在 a标题为 DateTime 的列)落在用户输入的开始日期和结束日期之间。 问题是我无法让 SELECT 查询工作。

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

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

但是,一旦我尝试将此字符串转换为 BETWEEN 类型的查询,我就会得到

“运行时错误‘13’:类型不匹配。

    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 . 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的参数化查询,并根据数据类型避免任何混乱的串联或引号/符号外壳。 然后将表单值绑定到 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

我认为你必须检查两件事:

  1. 在您的第一个注释SQL中,您有一个固定值#28/04/2019#而不是enddate变量。 你必须检查它是否也适用于变量。

  2. 可能问题在于您的日期格式dd/mm/yyyy 如果你没有明确它,如果日期<= 12(可能是一个月),Access查询解释器将把它读作mm/dd/yyyy

最好的方法是使用格式转换SQL中的所有日期,如下所示:

SELECT * FROM tbl_details WHERE (tbl_details.DateTime) BETWEEN #" & format(startdate,"mm/dd/yyyy") & "#" And "#" & format(enddate,"mm/dd/yyyy") & "#;"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM