BigQuery SQL:含双输入日期的存储过程能否自动化设置参数?
自动调用存储过程并动态生成日期参数
直接动态生成参数调用
不用手动输入日期,直接用MySQL的日期函数生成yyyymmdd格式的字符串,示例如下:
- 若每日处理前一天的数据:
CALL A.procedure( DATE_FORMAT(CURDATE() - INTERVAL 1 DAY, '%Y%m%d'), DATE_FORMAT(CURDATE() - INTERVAL 1 DAY, '%Y%m%d') );
- 若处理当天的数据,去掉
- INTERVAL 1 DAY即可:
CALL A.procedure( DATE_FORMAT(CURDATE(), '%Y%m%d'), DATE_FORMAT(CURDATE(), '%Y%m%d') );
如果想用变量存储日期再调用,注意使用用户变量(@开头),避免局部变量声明错误:
-- 定义前一天的日期变量 SET @start_date = DATE_FORMAT(CURDATE() - INTERVAL 1 DAY, '%Y%m%d'); SET @end_date = DATE_FORMAT(CURDATE() - INTERVAL 1 DAY, '%Y%m%d'); -- 调用存储过程 CALL A.procedure(@start_date, @end_date);
用MySQL事件调度器实现全自动化
如果需要每日自动执行,无需手动触发,可开启MySQL事件调度器:
- 先检查调度器状态:
SHOW VARIABLES LIKE 'event_scheduler';
- 若状态为
OFF,执行以下命令开启(需全局权限):
SET GLOBAL event_scheduler = ON;
- 创建每日执行的事件(示例为凌晨0点执行,处理前一天数据):
CREATE EVENT daily_run_procedure ON SCHEDULE EVERY 1 DAY STARTS '2024-05-20 00:00:00' -- 替换为你想要的首次执行时间 DO BEGIN CALL A.procedure( DATE_FORMAT(CURDATE() - INTERVAL 1 DAY, '%Y%m%d'), DATE_FORMAT(CURDATE() - INTERVAL 1 DAY, '%Y%m%d') ); END;
- 修改事件用
ALTER EVENT daily_run_procedure ...; - 删除事件用
DROP EVENT daily_run_procedure;
用Shell脚本+定时任务(Linux环境)
若不想依赖MySQL事件,可写Shell脚本配合crontab实现定时执行:
- 创建脚本文件
run_procedure.sh:
#!/bin/bash # 获取前一天的日期,格式为yyyymmdd YESTERDAY=$(date -d "yesterday" +%Y%m%d) # 替换为你的数据库用户名、密码 mysql -u your_username -pyour_password -e "CALL A.procedure('$YESTERDAY', '$YESTERDAY');"
- 给脚本添加执行权限:
chmod +x run_procedure.sh
- 编辑crontab,设置每日凌晨执行:
crontab -e
添加以下内容(替换脚本路径):
0 0 * * * /home/your_user/run_procedure.sh
内容的提问来源于stack exchange,提问作者Chad
相关产品推荐
相关产品推荐

