Ссылка Excel ODBC на SQL-запрос для результатов между датами

Я запускаю Excel 2016 на компьютере с Windows 10 Pro. Я установил соединение ODBC из Excel с внешней базой данных SQL MariaDB. Мой макрос 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, но я пытаюсь делать и учиться.

BETWEEN можно сделать также как date >= StartDate AND date <= EndDate. это сработает для вас?
FAB 12.06.2019 10:48

Я думаю, что это был один из альтернативных кодов, которые я пробовал. Я попробую еще раз.

RDK 12.06.2019 14:01

Во всех случаях опечатки!!! У меня был Data-Type вместо Data_Type. Теперь оба способа работают. Как я уже сказал, «действительно простой» ответ.

RDK 12.06.2019 14:47

Рад, что это работает для вас, было трудно указать на что-то, чего я не мог увидеть в вашем вопросе (Data-Type).

FAB 12.06.2019 14:52
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
696
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пока вы решили свою ситуацию, рассмотрите параметризацию в вашем 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

Спасибо за урок. Я немного новичок в этом и использую рекордер макросов, чтобы начать. Буду учиться и учиться на ваших комментариях. Спасибо еще раз.

RDK 12.06.2019 18:36

Другие вопросы по теме