编辑:12-APR-18 - 更改标题与实际问题来源
我认为它与如何在命令提示符中解析日期时间值有关,但它是一个转义错误,需要字符串中的^。 请参阅下面的回答
/编辑:
我认为我的mysql.exe会话存在问题,以及如何解释日期时间值,会喜欢一些输入。
当我的SQL查询通过命令行发送到服务器时,我无法过滤日期时间列上的记录,我使用的是mysql.exe。
过滤器适用于其他值,例如有符号数,但不适用于我的日期时间列。它总是从第一个记录返回。
如果我在MySQL工作台中使用该命令的SQL部分,则查询按预期工作 在运行查询之前,是否需要设置某种日期格式? 我尝试了CAST,CONVERT,STR_TO_DATE和显式字符串' YYYY-MM-DD HH:MM:SS'并且它们都不起作用。以下是两个例子:
在SQL Workbench中工作
Set @TEST = STR_TO_DATE('2018-01-01 00:00:00','%Y-%m-%d %T');
SELECT al.db_id,al.created,al.asset_id,al.log_id,CAST(al.latitude/1000000 AS DECIMAL(8,6)),CAST(al.longitude/1000000 AS DECIMAL(9,6)),BIN(al.IO8)
INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/Export_AssetLogs_Cust-83_Grp-189_From-20180101_Created-110418-1657.CSV'
FIELDS TERMINATED BY',' OPTIONALLY ENCLOSED BY '\"'
FROM asset_log as al
WHERE al.created > @TEST LIMIT 100;
使用MySQL.EXE
失败 mysql -h "127.0.0.1" -u <USER> -p<PASSWORD> -e "Set @TEST = STR_TO_DATE('2018-01-01 00:00:00','%Y-%m-%d %T');SELECT al.db_id,al.created,al.asset_id,al.log_id,CAST(al.latitude/1000000 AS DECIMAL(8,6)),CAST(al.longitude/1000000 AS DECIMAL(9,6)),BIN(al.IO8) INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/Export_AssetLogs_Cust-83_Grp-189_From-20180101_Created-110418-1657.CSV' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' FROM asset_log as al WHERE al.created > @TEST LIMIT 100;"
如果我在命令行中做错了,还尝试了避免单引号和双引号的变体。我确定这是显而易见的事情。
答案 0 :(得分:0)
我在提出这个问题之后离开了,我今天开始仔细研究这个问题。就在那时,我意识到了“大于”。符号是WINDOWS COMMAND PROMPT中的一个特殊字符,因此它没有进入查询,因此日期范围过滤器失败。要克服这个问题,我只需要逃避&gt;使用^所以日期的过滤器变为:
Escaped Greater Than,有效
al.created ^> @TEST
而不是:
al.created > @TEST
此查询取自PowerShell脚本,该脚本动态创建SQL和命令提示符执行逻辑以运行mysql.exe。我没有意识到我需要在整个过程中包含DOS转义字符,但现在很明显。希望这有助于其他人。