Почему значения даты, введенные в запросе SQL, не эквивалентны тому же значению даты в таблице Excel? - PullRequest
0 голосов
/ 21 января 2020

Код указан ниже:

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

Проблема в том, что objRecordset.EOF равно True для всего For-next l oop, что означает, что в рабочем листе N-MR Data не найдено совпадений которая соответствует паре в N-MR DTR Summary. Это странно, потому что те же столбцы Person и Date в N-MR DTR Summary получены из листа N-MR Data. И после проверки обе даты имеют числовой эквивалент c в 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

Жесткое кодирование даты в эквивалент нумерации c будет соответствовать и будет работать правильно, но если это был в формате даты (как в предыдущем примере), он не будет возвращать никаких совпадений. Приведенный ниже код будет работать как положено:

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 Ответ

0 голосов
/ 21 января 2020

43594 НЕ является датой. Это число. В Excel это число интерпретируется как число дней с 1899 по 1231.

Базы данных обычно не хранят даты таким образом. На самом деле не существует стандартного механизма внутреннего хранения дат в разных системах.

Правильный способ передачи константы даты в запрос - использовать типизированный параметр и назначить этому параметру соответствующее значение даты. .

Дополнительным способом является построение даты, предпочтительно в виде строки ГГГГММДД или ГГГГ-ММ-ДД.

Однако числа не являются датами и не должны рассматриваться как таковые.

...