为啥 SQL 查询中输入的日期值不等于 excel 工作表中的相同日期值?
Posted
技术标签:
【中文标题】为啥 SQL 查询中输入的日期值不等于 excel 工作表中的相同日期值?【英文标题】:Why are date values input in a SQL query not equivalent to the same date value in the excel worksheet?为什么 SQL 查询中输入的日期值不等于 excel 工作表中的相同日期值? 【发布时间】:2020-01-21 11:56:41 【问题描述】:代码如下:
If Total_rows_NMRDTRSummary > 1 Then
Dim objConnection As Variant
Dim objRecordset As Variant
Dim connectionString As String
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordset = CreateObject("ADODB.Recordset")
connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Users\Sun-Lap\Desktop\Payroll Computations (Template).xlsm; Extended Properties=""Excel 8.0; HDR=YES"";"
objConnection.Open connectionString
For i = 2 To Total_rows_NMRDTRSummary
objRecordset.Open "Select * FROM [N-MR Data$] WHERE Person = '" & ThisWorkbook.Worksheets("N-MR DTR Summary").Cells(i, 1) & "' AND Date = " & ThisWorkbook.Worksheets("N-MR DTR Summary").Cells(i, 2), objConnection, adOpenStatic, adLockOptimistic, adCmdText
Do Until objRecordset.EOF
Debug.Print objRecordset.Fields.Item("Date"), _
objRecordset.Fields.Item("Person")
objRecordset.MoveNext
Loop
objRecordset.Close
Next i
End If
问题是整个For-next
循环的objRecordset.EOF
是True
,这意味着在N-MR Data
工作表中找不到与N-MR DTR Summary
中的一对匹配的匹配项。这很奇怪,因为N-MR DTR Summary
中相同的Person
和Date
列是从N-MR Data
工作表派生的。经过检查,两个日期在 Excel 中都具有等价的数字。
有问题的部分是Recordset
对象:
objRecordset.Open "Select * FROM [N-MR Data$] WHERE Person = '" & ThisWorkbook.Worksheets("N-MR DTR Summary").Cells(i, 1) & "' AND Date = " & ThisWorkbook.Worksheets("N-MR DTR Summary").Cells(i, 2), objConnection, adOpenStatic, adLockOptimistic, adCmdText
将日期硬编码为数字等效项将具有匹配项并且可以正常工作,但如果它采用日期格式(如前面的示例),则不会返回任何匹配项。以下代码将按预期工作:
objRecordset.Open "Select * FROM [N-MR Data$] WHERE Person = '" & ThisWorkbook.Worksheets("N-MR DTR Summary").Cells(i, 1) & "' AND Date = 43594", objConnection, adOpenStatic, adLockOptimistic, adCmdText
【问题讨论】:
【参考方案1】:43594
不是日期。这是一个数字。 Excel 恰好将此数字解释为自 1899 年 12 月 31 日以来的天数。
数据库通常不会以这种方式存储日期。事实上,跨不同系统的日期内部存储没有标准机制。
将日期常量传递给查询的正确方法是使用类型化参数并为该参数分配适当的日期值。
第二种方法是构造一个日期,最好是 YYYYMMDD 或 YYYY-MM-DD 字符串。
但是,数字不是日期,不应被视为日期。
【讨论】:
我的 excel 列以MM/DD/YY
的格式显示它下面的每个日期单元格,如果我将它输入到 SQL 查询中,它将不适用于 SQL 查询字符串。我还尝试了Long Date
之类的格式,类似于Thursday, May 09, 2019
,但同样的问题也适用。这是否意味着我必须将 excel 日期转换为带有破折号的 YYYY-MM-DD
字符串,然后才能将其输入 sql 查询语句?
@Martin。 . .将其作为参数传入,输入为日期。以上是关于为啥 SQL 查询中输入的日期值不等于 excel 工作表中的相同日期值?的主要内容,如果未能解决你的问题,请参考以下文章