[英]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
。dbs
和rst
,最好添加库(例如Dim dbs as DAO.Database
),因为 ADO 和 DAO 库使用相同的类。考虑使用使用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
我认为你必须检查两件事:
在您的第一个注释SQL中,您有一个固定值#28/04/2019#
而不是enddate
变量。 你必须检查它是否也适用于变量。
可能问题在于您的日期格式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.