首页 > 解决方案 > Excel ODBC 链接到 SQL 查询以获取日期之间的结果

问题描述

我在 Windows 10 Pro 计算机上运行 Excel 2016。我已经建立了从 Excel 到外部 MariaDB SQL 数据库的 ODBC 连接。我的 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_TimeSQL 数据库中的格式为yyyy-mm-dd.

我正在输入这样的日期:

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

SQL 语句的 VBA 代码如下所示

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

这可能真的很简单,只表明我缺乏 SQL 经验,但我正在努力去做和学习。

标签: mysqlexcelvbaodbc

解决方案


当您解决了您的情况时,请考虑 ODBC 连接中的参数化,这是在 VBA 等应用层运行 SQL 的首选方式。使用参数化可以避免连接或标点符号的需要,并且建议在 VBA(例如 Java、Python、PHP)或 MariaDB(Oracle、SQL Server、Postgres)之外的一般编程行业中使用。

下面假设您在 Excel 中使用 ADO 并在模块上运行后期绑定。

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

推荐阅读