navicat 17 导出向导不支持时间条件筛选,必须先执行带 where 的查询(如 updated_at >= now() - interval 7 day),再右键结果集选择“导出全部记录”,否则导出为空或仅限预览页。
navicat 17 的「导出向导」本身不支持时间条件筛选,直接右键表→导出向导,只会导出整张表或当前网格页数据,无法按 updated_at >= date_sub(now(), interval 7 day) 这类逻辑过滤。真正可行的路径只有一条:先执行带 where 的查询,再导出结果集。
必须先运行查询,否则导出按钮置灰或导出为空
Navicat 不会自动加载全表数据,你点开一张表看到的只是默认 LIMIT 1000 的预览。想导出“最近一周修改”的记录,第一步永远是手动写 SQL 并点击运行(F6):
- 在查询编辑器中输入类似语句:
SELECT * FROM orders WHERE updated_at >= DATE_SUB(NOW(), INTERVAL 7 DAY); - 确认字段名准确(如用的是
modified_time或last_updated,不是updated_at) - 检查字段类型是否为
DATETIME或TIMESTAMP;若为VARCHAR存储时间字符串,DATE_SUB会失效 - 执行后,下方结果集必须显示非空行数——如果显示 0 行,别急着导出,先查是不是时区偏差、NULL 值或精度截断导致漏匹配
导出时选“全部记录”,别被“当前页”误导
执行完查询后,右键结果集区域 →「导出记录」,弹窗里有两个关键选项:
- 勾选 全部记录(不是“当前页”):Navicat 会遍历整个查询结果集,不受界面分页限制
- 若右下角状态栏显示“仅显示前 N 行”,需先在查询编辑器右下角取消勾选该限制,或设为 0
- 导出格式选
CSV或Excel更便于后续分析;选SQL格式则会生成INSERT语句,注意字符集和 NULL 处理(如NULL字段是否导出为NULL还是空字符串)
WHERE 条件要适配数据库方言,不能通用复制
同一套时间逻辑,在不同数据库里写法不同,直接粘贴会报错:
- MySQL:
updated_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)或updated_at >= NOW() - INTERVAL 7 DAY - PostgreSQL:
updated_at >= NOW() - INTERVAL '7 days'(注意单引号和复数) - SQL Server:
updated_at >= DATEADD(day, -7, GETDATE()) - 字段含空格或关键字时,用反引号(MySQL)或双引号(PostgreSQL)包裹,例如:
`last modified` >= ...
容易被忽略的三个隐性失败点
即使 SQL 语法正确、也成功执行了,仍可能导出 0 条记录,原因往往不在 WHERE 本身:
-
updated_at字段大量为NULL:Navicat 过滤时跳过这些行,不报错也不提示——先SELECT COUNT(*) FROM table WHERE updated_at IS NULL确认覆盖率 - 应用写入用 UTC,数据库时区设为
Asia/Shanghai:NOW() 返回东八区时间,对比时天然偏差 8 小时——临时改写为CONVERT_TZ(NOW(), '+08:00', '+00:00')测试 - 字段精度问题:MySQL 5.6 之前
TIMESTAMP不存毫秒,而应用写入带毫秒(如2026-05-30 14:22:01.892),入库后变成2026-05-30 14:22:01,刚好卡在临界点外
时间戳过滤只管“有更新”,不管“已被删除”。如果你需要目标端与源端完全一致,得额外处理删除操作——Navicat 数据同步默认不删目标库中源里不存在的行,这个行为和导出无关,但常被误认为是导出没生效。











