Sequelize中如何查看db.sequelize.literal('CURRENT_TIME')的实际值?
Sequelize中如何查看CURRENT_TIME字面量的实际值并验证时区一致性
问题描述
使用Sequelize查询时遇到时区问题,对比当前时间时怀疑CURRENT_TIME的取值存在偏差。为排查问题,编写了以下查询代码:
const data = await db.Bar.findAll({ where: { [Op.and]: [ { [dayAttributeOpening]: { [Op.lte]: db.sequelize.literal('CURRENT_TIME') } }, // 其他查询条件 ] } });
随后通过测试代码查看时间情况:
const time = await db.Bar.sequelize.query("Select now()") console.log("Time now: " + JSON.stringify(time, null, 4)); const time2 = db.sequelize.literal('CURRENT_TIME') console.log("Time now literal: " + JSON.stringify(time2, null, 4))
得到输出:
Time now: [ { "now": "2023-12-06T01:41:11.375Z" } ,... Time now literal: { "val": "CURRENT_TIME" }
预期now()应返回2023-12-06T02:41:11.375Z,需要明确如何查看db.sequelize.literal('CURRENT_TIME')的实际值,以及它是否与服务器now()的值一致。
解决方案
1. 直接在数据库中对比CURRENT_TIME和now()的实际值
sequelize.literal('CURRENT_TIME')只是封装了SQL表达式,不会在Node.js层面计算,必须通过数据库执行才能拿到实际值。可以直接执行SQL同时查询两者:
const [results] = await db.sequelize.query("SELECT CURRENT_TIME, now();"); console.log("CURRENT_TIME 与 now() 的对比结果:", JSON.stringify(results, null, 4));
这样就能直接获取数据库返回的CURRENT_TIME实际值,和now()对比,确认两者的时区是否一致。
2. 开启Sequelize日志查看实际执行的SQL
通过开启Sequelize的日志功能,可以看到发送给数据库的完整SQL语句,确认CURRENT_TIME是直接由数据库执行的:
- 全局开启日志(初始化Sequelize时配置):
const sequelize = new Sequelize({ // 其他连接配置 logging: console.log // 将SQL日志打印到控制台 });
- 单个查询临时开启日志:
const data = await db.Bar.findAll({ where: { [Op.and]: [ { [dayAttributeOpening]: { [Op.lte]: db.sequelize.literal('CURRENT_TIME') } } ] }, logging: console.log // 仅本次查询打印日志 });
查看日志中的SQL,就能确认CURRENT_TIME是作为原生SQL的一部分被数据库执行,其取值完全依赖数据库的时区设置。
额外说明
- 以MySQL为例,
CURRENT_TIME返回当前**仅含时间(无日期)**的结果,时区遵循数据库系统时区;now()返回带日期的完整时间戳,同样使用数据库时区。 - 若出现时间偏差,需检查:
- 数据库时区配置(可执行
SELECT @@time_zone;查看) - Sequelize连接配置中的
timezone参数是否与数据库时区匹配(例如'+00:00'对应UTC时区)
- 数据库时区配置(可执行
内容的提问来源于stack exchange,提问作者BenoHiT
相关产品推荐
相关产品推荐

