navicat自身不支持“仅工作日”触发,必须依赖操作系统调度器:windows用任务计划程序勾选周一至周五,macos/linux用cron表达式1-5(周一至五),通过ncli.exe调用已保存的连接与查询,严禁在sql中判断工作日。
navicat 定时任务不支持直接设置“仅工作日”触发
navicat 自带的计划任务(scheduled tasks)底层依赖操作系统级调度(windows 用 task scheduler,macos/linux 用 cron),它本身没有 weekdays_only 或类似勾选项。所谓“只在工作日执行”,必须靠外部调度器控制,navicat 任务本身只负责“被调用时执行 sql”。
Windows 下用 Task Scheduler 实现工作日触发
这是最常见场景。关键不是改 Navicat 设置,而是让 Windows 任务计划程序只在周一到周五启动 Navicat 的命令行执行器:
- Navicat 提供
ncli.exe(位于安装目录,如C:\Program Files\PremiumSoft\Navicat Premium 16\ncli.exe),可用它运行已保存的连接和查询 - 新建基本任务 → 触发器中选择“按预定计划”,点击“详细设置” → 勾选“仅在以下天数运行”,手动勾选周一至周五
- 操作设置为“启动程序”,程序填
ncli.exe,参数填类似:--connection="MyDB" --query="D:\scripts\backup.sql" - 注意:如果连接需要密码,
ncli.exe不支持明文传参,得提前在 Navicat 中保存带密码的连接,且勾选“允许在未登录时运行”(Windows 凭据管理器需配置对应凭据)
macOS/Linux 下用 cron 判断 weekday 并跳过周末
Unix 系统靠 cron + shell 判断更灵活,但容易因时区或脚本权限出错:
- cron 表达式本身不区分工作日语义,
0 2 * * 1-5是标准写法(每周一至五凌晨 2 点),但注意:数字 1=周一,5=周五,1-5才是工作日,2-6是周二到周六 - 若需更复杂逻辑(比如避开节假日),得在脚本里加判断:
date +%u返回 1–7(周一=1),配合case或[ $(date +%u) -le 5 ]控制是否执行ncli - 务必确认运行 cron 的用户有 Navicat CLI 的执行权限,且
PATH包含ncli路径(macOS 常在/Applications/Navicat Premium.app/Contents/MacOS/ncli) - 日志输出建议重定向,否则失败时无声无息:
0 2 * * 1-5 /path/to/ncli ... >> /tmp/navicat_cron.log 2>&1
为什么别在 Navicat 内部 SQL 里做 weekday 判断
有人想在定时执行的 SQL 脚本开头加 IF DAYOFWEEK(NOW()) IN (1,7) THEN EXIT; END IF; —— 这不可靠:
- MySQL 的
DAYOFWEEK()返回 1=周日、2=周一,和 cron 的 1=周一不一致,极易混淆 - PostgreSQL、SQL Server 等方言 weekday 函数行为不同,跨数据库迁移时失效
- SQL 层判断无法阻止 Navicat 连接建立、日志记录、资源占用,纯属“事后放弃”,不如调度层直接不触发
- 如果任务含 DDL 或事务,中途退出可能留下锁或半状态,比根本不运行更危险
真正要稳,就得把“是否该跑”这件事交给调度器,而不是塞进数据库逻辑里。Windows 任务计划器的图形化勾选、cron 的 1-5 字段,才是干净解法。路径、权限、时区、凭据——这些细节漏一个,任务就静默失败。











