我想扩展此选择查询以在两个日期之间进行过滤。
"SELECT * FROM ["&"1_RPA_GBR_AC_022.csv"&"] T "
上面的选择查询从 OLEDB 连接文件名:1_RPA_GBR_AC_022.csv 中获取所有数据并将其放入集合中。
我只想获取两个设定日期之间的数据。
20/03/2023 00:00:00
27/03/2023 00:00:00
"SELECT * FROM ["&"1_RPA_GBR_AC_022.csv"&"] T WHERE LastUpdated >= '20/03/2023 00:00:00' AND LastUpdated <= '27/03/2023 00:00:00'"
但是我收到的语法错误是标准表达式中的数据类型不匹配。任何帮助和指导将不胜感激。
谢谢
使用的连接字符串:
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & [Extract Folder] & ";Extended Properties = 'text';"
这是因为您使用的是 JET Oledb 驱动程序,它不知道 '27/03/2023 00:00:00' 表示日期时间。换句话说,您的查询显示了使用参数而不是硬编码或用户输入字符串值的重要性。如果您要对日期时间文字进行硬编码,那么您应该以正确的方式进行编写并编写为:
#2023/03/27 00:00:00#
这是 ODBC 规范格式,# 用作日期时间文字“引号”。
更好的方法当然是使用参数:
Sub Main()
Dim adapter = New OleDbDataAdapter("select * from [1_RPA_GBR_AC_022.csv]
WHERE LastUpdated >= @start AND LastUpdated <= @end",
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & [Extract Folder] & ";Extended Properties = 'text';")
adapter.SelectCommand.Parameters.Add("@start", OleDbType.Date).Value = New DateTime(2023, 3, 20)
adapter.SelectCommand.Parameters.Add("@end", OleDbType.Date).Value = New DateTime(2023, 3, 27)
Dim t As DataTable = New DataTable()
adapter.Fill(t)
' Do whatever with t
End Sub
DROP TABLE IF exists [#Temp]
CREATE TABLE [#Temp] ([LastUpdated] [text])
INSERT INTO [#Temp] Values ('20/03/2023 00:00:00'), ('27/03/2023 00:00:00')
SELECT * FROM [#Temp] T
WHERE CONVERT(varchar, CONVERT(VARCHAR(MAX), [LastUpdated]), 103) >= '20/03/2023 00:00:00'
AND CONVERT(varchar, CONVERT(VARCHAR(MAX), [LastUpdated]), 103) <= '27/03/2023 00:00:00'
希望这有帮助。
参考-https://www.mssqltips.com/sqlservertip/1145/date-and-time-conversions-using-sql-server/