MySQL用NOW()或CURRENT_TIMESTAMP,PostgreSQL用NOW()或CURRENT_TIMESTAMP,SQL Server用GETDATE()或SYSDATETIME();显式插入NULL将覆盖默认时间值,应省略字段让数据库自动填充。

INSERT 语句里怎么写当前时间(MySQL / PostgreSQL / SQL Server)
直接用数据库原生函数,别手输 NOW()、CURRENT_TIMESTAMP 这类字符串——DBeaver 不会帮你转义或识别,输成字符串就真当字符串插进去,字段类型不匹配还会报错。
不同数据库语法有差异,写错会导致插入失败或值为 0000-00-00 00:00:00(MySQL)或 NULL(严格模式下):
- MySQL:用
NOW()或CURRENT_TIMESTAMP() - PostgreSQL:用
NOW()或CURRENT_TIMESTAMP(括号可省) - SQL Server:用
GETDATE()或SYSDATETIME() - Oracle:用
SYSDATE(无括号)
示例(MySQL):
INSERT INTO orders (id, created_at) VALUES (123, NOW());
表结构含 DEFAULT CURRENT_TIMESTAMP,但 INSERT 时显式传了 NULL 怎么办
这是最常被忽略的坑:哪怕字段定义了 DEFAULT CURRENT_TIMESTAMP,只要你在 INSERT 里写了 NULL 或空值,数据库就真按 NULL 处理,不会触发默认值。
检查方式很简单:执行 DESCRIBE table_name;(MySQL)或 \d table_name(PostgreSQL),确认默认值是否生效;再看你的 INSERT 语句有没有把该字段列出来。
安全写法是——不提这个字段:
INSERT INTO logs (message) VALUES ('system start');
(让数据库自动填时间)
而不是:
INSERT INTO logs (message, created_at) VALUES ('system start', NULL);
DBeaver 的「编辑数据」界面点 + 号新增行,时间字段为啥还是空
因为 DBeaver 编辑视图默认不自动填充默认值,它只做“所见即所得”的字段映射。即使你建表时写了 created_at DATETIME DEFAULT CURRENT_TIMESTAMP,在 GUI 新增行时,该单元格仍显示为空白或 NULL。
解决方法只有两个:
- 手动在时间列输入
NOW()(注意:不是字符串,是函数名,DBeaver 会把它当表达式提交) - 右键单元格 → Set Default Value(仅对支持默认值的驱动有效,如 PostgreSQL;MySQL 驱动多数不响应此操作)
更稳的办法:别用 GUI 新增,直接写 INSERT 语句执行。
Java 应用连 DBeaver 同库,时间写入结果不一致
常见于 JDBC URL 没配时区,比如 MySQL 连接串漏了 serverTimezone=Asia/Shanghai。DBeaver 默认用自己的系统时区解析时间,而 Java 应用可能用 UTC 或其他时区生成 java.time.LocalDateTime,导致同一条 INSERT 在两边看到的时间差 8 小时。
验证方法:在 DBeaver 执行 SELECT @@time_zone, @@system_time_zone;(MySQL)或 SHOW TIMEZONE;(PostgreSQL),再对比应用日志里实际发送的 SQL 参数。
临时绕过:在 DBeaver 的连接设置 → Driver properties 里加 serverTimezone(MySQL)或 currentSchema(PostgreSQL),和应用保持一致。
DBeaver 本身不干预时间值的语义,它只是把你的输入原样发给数据库。真正起作用的是 SQL 函数、表定义里的 DEFAULT、JDBC 驱动的时区配置——这三个地方任何一个没对齐,时间就容易错得悄无声息。











