Excel ODBC ссылка на SQL-запрос для результатов между датами - PullRequest
0 голосов
/ 12 июня 2019

Я использую Excel 2016 на компьютере с Windows 10 Pro.Я установил соединение ODBC из Excel с внешней базой данных MariaDB SQL.Мой макрос VBA в основном работает так, как я хочу, но у меня возникают проблемы с выбором записей между двумя датами.Этот оператор SQL работает:

SELECT Date_Time, ChargerSt FROM `MyDBx`.`table` WHERE (Date_Time>{ts '2019-06-01 00:00:00'}) ORDER BY Date_Time;

Однако мне не удалось получить какую-либо комбинацию предложений WHERE, используя BETWEEN date1 AND date2;выше в сочетании с Date_Time<{ts '2019-06-11 00:00:00'} для работы.Формат Date_Time в базе данных SQL в yyyy-mm-dd.

Я ввожу даты следующим образом:

firstdate = InputBox("Enter starting date (yyyy-mm-dd)")
seconddate = Format((DateValue(firstdate) - 7#), "yyyy-mm-dd")

и код VBA для оператора SQL выглядит следующим образом

"SELECT Date_Time, ChargerSt FROM `MyDBx`.`table` " _
 & "WHERE (Date_Time>{ts '" & firstdate & " 00:00:00'})" & " ORDER BY Date_Time"

Вероятно, это действительно очень просто и показывает только мой недостаток опыта в SQL, но я пытаюсь учиться.

1 Ответ

1 голос
/ 12 июня 2019

Пока вы решили свою ситуацию, рассмотрите возможность параметризации в вашем соединении ODBC, которое является предпочтительным способом запуска SQL на уровне приложений, таком как VBA. С помощью параметризации вы избегаете необходимости объединять или пунктуировать, и это рекомендуется в общей индустрии программирования за пределами VBA (например, Java, Python, PHP) или MariaDB (Oracle, SQL Server, Postgres).

Ниже предполагается, что вы используете ADO в Excel и запускает позднюю привязку для модуля.

Public Sub RunSQL()   
    Dim firstdate As Date, seconddate As Date
    Dim sql as String, conn As Object, cmd As Object, rst As Object
    Const adCmdText = 1, adParamInput = 1, adDate = 7

    firstdate = DateValue(InputBox("Enter starting date (yyyy-mm-dd)"))
    seconddate = firstdate - 7

    Set conn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")

    conn.Open "Driver={MySQL ODBC 5.3 Unicode Driver};host=hostname;" _
               & "database=databasename;UID=username;PWD=****"

    ' PREPARED STATEMENT (NO DATA)
    sql = "SELECT Date_Time, ChargerSt FROM `MyDBx`.`table` WHERE `DateTime` BETWEEN ? AND ?"
    ' CONFIGURE ADO COMMAND
    Set cmd = CreateObject("ADODB.Command")
    With cmd
        .ActiveConnection = conn
        .CommandText = sql
        .CommandType = adCmdText
        ' BIND DATE VALUES
        .Parameters.Append .CreateParameter("start_param", adDate, adParamInput, , firstdate)
        .Parameters.Append .CreateParameter("start_param", adDate, adParamInput, , seconddate)
        ' CREATE RECORDSET
        Set rst = .Execute
    End With

    '... USE RECORDSET

    rst.Close
    Set rst = Nothing: Set cmd = Nothing: Set conn = Nothing    
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...