编辑:2018年4月12日-更改标题和实际问题来源
我认为这与在命令提示符中如何解析datetime值有关,但这是一个转义错误,需要在字符串中使用“^”。请看下面我的答案
/编辑:
我想我的mysql.exe会话有问题,它是如何解释datetime值的,需要一些输入。
当我的sql查询通过命令行发送到服务器时,我无法过滤datetime列上的记录,我使用的是mysql.exe。
过滤器适用于其他值,如有符号的数字,但不适用于my datetime列。它总是从第一个记录返回。
如果我在mysql工作台中使用命令的sql部分,查询将按预期工作。
在运行查询之前是否需要设置某种日期格式?我试过cast、convert、str\u to\u 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;"
还尝试了转义单引号和双引号的变体,以防我在命令行中出错。我相信这是显而易见的。
1条答案
按热度按时间k3fezbri1#
我问完这个问题就走开了,今天我开始仔细看这个问题。就在那时,我意识到大于>符号是windows命令提示符中的一个特殊字符,因此它没有进入查询,因此日期范围过滤器失败。为了克服这个问题,我只需要用^来转义>,所以日期的过滤器变成:
逃逸大于,工作
而不是:
此查询来自powershell脚本,该脚本动态创建sql和命令提示符执行逻辑以运行mysql.exe。我没有意识到我需要在整个过程中包含dos转义字符,但现在已经很明显了。希望这能帮助别人。