在 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
.
- 在声明
dbs
和rst
时,最好添加库(例如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
早上好,有人可以帮我解决这个 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
. - 在声明
dbs
和rst
时,最好添加库(例如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