Я запускаю 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, но я пытаюсь делать и учиться.
Я думаю, что это был один из альтернативных кодов, которые я пробовал. Я попробую еще раз.
Во всех случаях опечатки!!! У меня был Data-Type вместо Data_Type. Теперь оба способа работают. Как я уже сказал, «действительно простой» ответ.
Рад, что это работает для вас, было трудно указать на что-то, чего я не мог увидеть в вашем вопросе (Data-Type
).
Пока вы решили свою ситуацию, рассмотрите параметризацию в вашем 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
Спасибо за урок. Я немного новичок в этом и использую рекордер макросов, чтобы начать. Буду учиться и учиться на ваших комментариях. Спасибо еще раз.
BETWEEN
можно сделать также какdate >= StartDate AND date <= EndDate
. это сработает для вас?