navicat 不支持 now() 等函数的自动补全,仅提供 $now$ 等运行时变量(执行前替换为本地时间字符串),无法用于表达式计算;需手动输入数据库原生函数如 now() 或 getdate() 以确保服务端生成时间与时区一致。
navicat 里没有 now() 或 current_timestamp 的自动补全快捷键
navicat 的 sql 编辑器本身不提供类似 ide 的“输入 now 按 tab 补全为 now()”功能,也不支持用户自定义代码片段缩写(比如 typing dt → expand to now())。这是很多从 vs code 或 dbeaver 切过来的用户最先踩的坑。
它只对标准 SQL 关键字(如 SELECT、WHERE)有基础高亮和小写转大写功能,但对函数名、别名、自定义变量等完全不识别补全。
- 你输
now,它不会提示NOW();输cur,也不会弹出CURRENT_DATE - 哪怕你在连接的是 MySQL,且该函数确实合法,编辑器也视而不见
- 这个限制跟数据库类型无关——MySQL / PostgreSQL / SQL Server 连接下表现一致
唯一可靠的插入方式:用 Navicat 内置的「运行时变量」$NOW$
Navicat 提供了几个预定义的运行时变量(runtime variables),在执行前由客户端替换为实际值。其中最常用的就是 $NOW$,它会在点击「运行」时被替换成当前系统时间(格式为 'YYYY-MM-DD HH:MM:SS'),且是字符串字面量,不是函数调用。
- 直接在 SQL 编辑器中输入
$NOW$,例如:INSERT INTO logs(time) VALUES ($NOW$); - 执行时,Navicat 会把它替换成类似
'2024-06-12 15:23:47'的字符串,再发给服务器 - 注意:它不经过数据库解析,所以不能用于表达式,比如
WHERE created_at > $NOW$ - INTERVAL 1 DAY是无效的 - 其他可用变量还有
$DATE$(仅日期)、$TIME$(仅时间)、$USER$(当前连接用户名)
想用真正的函数(如 NOW())?只能手动输或复制粘贴
如果你需要数据库服务端生成时间(比如触发默认值、参与计算、或确保时区一致性),就必须显式写函数。Navicat 不拦截也不改写这些函数,但也不会帮你省一个字母。
- MySQL 常用:
NOW()、CURRENT_TIMESTAMP()、SYSDATE() - PostgreSQL:
NOW()、CURRENT_TIMESTAMP(注意无括号也可) - SQL Server:
GETDATE()、SYSDATETIME() - 建议建个纯文本备忘录,把常用函数按数据库分组存好,Ctrl+C / Ctrl+V 是目前最快路径
为什么不用外部工具或插件绕过?
Navicat 不开放编辑器扩展接口,也不支持加载外部 snippet 插件(不像 DBeaver 可装 SQL Templates 插件,或 VS Code 装 SQLTools)。第三方 AutoHotkey / TextExpander 类工具虽能模拟输入,但在 Navicat 多标签页 + 多连接场景下容易错位触发,反而增加出错概率。
真正容易被忽略的是时区陷阱:$NOW$ 取的是本地系统时间,而 NOW() 在 MySQL 中默认返回服务器时区时间——如果开发机和数据库服务器跨时区,两者可能差好几个小时,线上排查时经常卡在这一步。











