如何让MySQL自动为导出的CSV文件添加首尾日期命名
解决MySQL导出CSV自动带时间范围文件名的方案
MySQL的INTO OUTFILE语法不支持直接在文件名中嵌入动态变量,要实现自动生成带时间范围的文件名,需要用**预处理语句(Prepared Statement)**来动态拼接SQL语句。以下是具体实现:
具体代码
-- 定义查询的时间范围变量 SET @start_date = '2020-09-21'; SET @end_date = '2022-11-02'; -- 动态生成目标文件名,将日期格式转为无横杠的YYYYMMDD形式 SET @file_name = CONCAT( 'FieldData_', REPLACE(@start_date, '-', ''), '_', REPLACE(@end_date, '-', ''), '.csv' ); -- 拼接完整的导出查询语句(新增WHERE条件确保只导出指定时间范围的数据) SET @sql_query = CONCAT( "SELECT 'datetime','sensor_1','sensor_2' UNION ALL SELECT datetime,sensor_1,sensor_2 FROM `field_schema`.`sensor_table` WHERE datetime >= '", @start_date, "' AND datetime <= '", @end_date, "' INTO OUTFILE '", @file_name, "' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n'" ); -- 预处理并执行动态生成的SQL语句 PREPARE stmt FROM @sql_query; EXECUTE stmt; DEALLOCATE PREPARE stmt;
注意事项
- 执行该语句的MySQL用户必须拥有
FILE权限,且导出路径需符合secure_file_priv系统变量限制的安全路径(可通过SHOW VARIABLES LIKE 'secure_file_priv';查看) - 若你的
datetime字段是DATE类型,WHERE条件的写法完全适用;如果是其他时间类型,需根据实际情况调整条件格式 - 后续修改时间范围时,只需更新
@start_date和@end_date两个变量即可,无需修改文件名和查询逻辑
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

