Страницы: 1
RSS
Несоответствии типов SQL и VBA
 
Добрый день

Пытаюсь обратится к листам через SQL запрос, чтобы получить выборку данных, например все данные с 3 часов до 8 часов.

Отлавливаю ошибку
Run-time error '-2147217913 (80040e07)
Несоответствие типов данных в выражении условия отбора

Сам код как мне кажется рабочий.
Так если SQL запрос ограничить таким вариантом
sSQL = "SELECT * FROM " & tableName
то все работает, но проблема у столбца со временем, в котором значения становятся некорректными вместо 2:54:00 там 00.01.1900  2:54:00.

Предполагаю что ошибка в несоответствии типов SQL и VBA.

Соответственно фрагмент  кода, где это все происходит.


Код
...
    Dim startLT As Double
    Dim endLT As Double
    startLT = ThisWorkbook.Worksheets(1).Range("D7").Value
    endLT = ThisWorkbook.Worksheets(1).Range("E7").Value
   
    'преобразую в формат пользовательский hh.hh в формат hh:mm:ss  (т.е. 2.5 = 2:30:00)
    Dim startTime As Date
    Dim endTime As Date
    startTime = CDate(startLT / 24)
    endTime = CDate(endLT / 24)

    Dim CN As New ADODB.connection         
    CN.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Data Source=" & fName & _
                            ";Extended Properties=""Excel 12.0;HDR=YES"""
    CN.Open
    
    'листы для запросов
    Dim names
    names = Array("000", "001", "010", "011", "100", "101", "110")
    Dim i As Long
    Dim sSQL As String
    Dim tableName As String
    Dim sqlTime As String
    sqlTime = "SQLTime"            'заголовок столбца
    For i = 1 To UBound(names, 1)
        
        ActiveWorkbook.Worksheets("Summary").Activate
        
        'очистка для удобства теста
        ActiveSheet.Cells.Select
        Selection.Delete xlUp
        Selection.Clear
        
        Set RS = Nothing
        Set RS = CreateObject("ADODB.Recordset")
        
        tableName = "[" & CStr(names(i)) & "$]"
        sSQL = "SELECT * FROM " & tableName & " WHERE " & sqlTime & " BETWEEN '" & startTime & "' AND '" & endTime & "'"
       
        'в окне locals значения 
        'sSQL ="SELECT * FROM [001$] WHERE SQLTime BETWEEN '3:00:00' AND '8:00:00'"
        'startTime=#3:00:00#        '<- тип Date
        'endtime=#8:00:00#          '<- тип Date


        MsgBox sSQL
        RS.Open sSQL, CN              ' <<<< РУГАЕТСЯ НА ЭТУ СТРОКУ
        ActiveWorkbook.Worksheets("Summary").Activate
        Range("A1").CopyFromRecordset RS
    Next i
...
Подскажите, как исправить проблему

Спасибо
 
А почему у Вас startTime и endTime в одинарных кавычках? Вы в курсе, что в SQL в одинарных кавычках только текст передается? Проще говоря, Вы сами в SQL подпихиваете в условие отбора сравнение по тексту, в то время как в таблице данных там тип ДатаВремя. И эти даты и время должны быть заключены в решетки:
#8/28/2016#
Без всяких там кавычек.
Изменено: The_Prist - 28.08.2016 10:43:00
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Хорошо, спасибо
сделал так
Код
sSQL = "SELECT * FROM " & tableName & " WHERE sqlTime" & " BETWEEN #" & startTime & "# AND #" & endTime & "#"
вроде отработало

Правда мне не совсем тогда понятен вывод в locals, где хранятся такие значения. Вроде сами #там уже были.
Код
startTime=#3:00:00#        
endtime=#8:00:00#         

Второй момент. После выполнения запроса в столбце SQLTime появляются данные такого вида
Код
00.01.1900  3:42:00
00.01.1900  4:30:00 
То есть дополнительно появился день, месяц и год. Можно это как-то отрезать при выполнении SQL запроса ?

Спасибо
 
Цитата
roocs написал: Вроде сами #там уже были.
Потому что VBA(как и SQL) для идентификация дат использует решетки. Если в VBA напрямую записать дату с решетками - никаких преобразований вроде CDate не потребуется:
Код
dd = #8/28/2016#

Цитата
roocs написал: появился день, месяц и год. Можно это как-то отрезать
Попробуйте формат назначать при передаче:
Код
BETWEEN #" & Format(startTime,"hh:nn:ss") &
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
и для WHERE я бы тоже поставила форма и для BETWEEN (как в #4)...
и может даже так Format$(startTime,"hh\:nn\:ss")
почему - не знаю - просто видела
Цитата
- тут обратный слеш - экранирующий символ. Благодаря ему в сформированной строке будут всегда двоеточия, независимо от рег. настроек.
в принципе и ms-справка есть - Format the date and time field in Access
(вы файл не приложили - разбираться негде)
Изменено: JeyCi - 28.08.2016 11:53:46
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Попробовал сделать
Код
sSQL = "SELECT * FROM " & tableName & " WHERE sqlTime" & " BETWEEN #" & Format(startTime, "hh:nn:ss") & "# AND #" & Format(endTime, "hh:nn:ss") & "#"
не помогло

Поэтому решил пока так
Код
Range("L1:L" & getLastRow("A")).NumberFormat = "hh:mm:ss"

Спасибо
 
Еще вопрос по SQL запросу - если выборку делать например от 20 часов вечера до 3 часов утра


сейчас делаю так
Код
strTempSQL = "SELECT * FROM " & tableName & _
                " WHERE (sqlTime BETWEEN #" & startTime & "# AND #24:00:00#) OR (sqlTime BETWEEN #00:00:00# AND #" & endTime & "#)"

возникает ошибка - "Дата содержит синтаксическую ошибку в выражении запроса..."

по гуглу искал, но так и не смог понять что не так
 
roocs.Вам бы теорию почитать, а потом уже запросы такие писать.
Код
 " WHERE Hour(sqlTime)>= " & Hour(startTime) & " OR Hour(sqlTime)<= " & Hour(endTime)
Изменено: Doober - 30.08.2016 10:54:35
 
Код
Function DateSql(dt_sql)
DateSql = "#" & Format(dt_sql, "mm\/dd\/yy hh\:mm\:ss") & "#"
End Function
Это вам для правильной интерпретации даты и времени.
Да... и время от даты не храните отдельно..... не расчленяйте то, что должно быть единым :))
Вам же потом легче будет.
Спасибо
Страницы: 1
Читают тему
Наверх