无法使用 ODBC 将用户定义的变量从 MySQL 设置为 Excel

Can't Set User-defined Variable From MySQL to Excel With ODBC

我有一个查询,在主查询之上设置了一个用户定义的变量。是这样的。

set @from_date = '2019-10-01', @end_date = '2019-12-31';
SELECT * FROM myTable
WHERE create_time between @from_date AND @end_date;

当我在MySQL Workbench中执行它时它工作得很好,但是当我通过MySQL ODBC将它放入Excel时它总是显示这样的错误.

我需要那个用户定义的变量才能在 Excel 中工作。我应该在查询中更改什么?

ODBC 连接器很可能通过语句或准备好的语句与 MySQL 通信,一次一个语句,并且不支持用户变量。准备好的语句是您可以绑定日期文字的一种方式。根据您的示例,此处的另一个选择是仅内联日期文字:

SELECT *
FROM myTable
WHERE create_time >= '2019-10-01' AND create_time < '2020-01-01';

旁注:我在 create_time 上表达了支票,它似乎想包括 2019 年最后一个季度,使用不等式。这样做的原因是,如果 create_time 是 timestamp/datetime,那么在 RHS 上使用 BETWEEN 和 31-December 将只包括那天的午夜,之后的任何时间都不会。

对变量值初始化使用子查询:

SELECT * 
FROM myTable,
     ( SELECT @from_date := '2019-10-01', @end_date := '2019-12-31' ) init_vars
WHERE create_time between @from_date AND @end_date;

关注:

    使用的是
  1. SELECT,不是SET
  2. 使用了赋值运算符:==运算符将被视为比较一个,在这种情况下给出错误的结果;
  3. 别名(init_vars)可以是任意的,但它是强制性的。

变量被初始化一次,但可能会被多次使用。

如果您的查询很复杂(嵌套),则必须在最内部的子查询中初始化变量。或者在第一个 CTE 中,如果 DBMS 版本知道 CTE。如果查询非常复杂,无法确定"the most inner"是什么子查询,那么先查找table被扫描的执行计划,并使用其子查询对变量init(但记住执行计划可能随时更改)。