为啥 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.EOFTrue,这意味着在N-MR Data 工作表中找不到与N-MR DTR Summary 中的一对匹配的匹配项。这很奇怪,因为N-MR DTR Summary 中相同的PersonDate 列是从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 工作表中的相同日期值?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server——如何指定日期格式

为啥多维数组的枚举值不等于自身?

为啥excel日期会变成数字

如何在 Excel 中使用 SQL 连接获取日期范围提示

为啥这棵决策树在每一步的值不等于样本数?

excel输入日期为啥总变成数字是怎么回事?