如何在Sequelize中将TIME类型字段返回格式改为"HH:mm"格式?
解决Sequelize查询TIME字段返回格式问题
这个问题我之前也碰到过,Sequelize对SQL Server的TIME类型默认会转成带日期的ISO格式Date对象,不过有两种简单的方法可以改成你想要的"12:00"格式:
方法一:在模型中定义Getter(全局生效)
直接在模型的字段定义里添加一个getter函数,每次查询该字段时自动格式化输出。因为Sequelize会把SQL Server的time(7)类型映射为JavaScript的Date对象,我们可以从这个Date中提取时分部分:
const { DataTypes } = require('sequelize'); const YourModel = sequelize.define('YourModel', { // 其他字段... userTime: { type: DataTypes.TIME, get() { const rawValue = this.getDataValue('userTime'); if (!rawValue) return rawValue; // 提取HH:mm格式字符串 return rawValue.toTimeString().slice(0, 5); // 如果需要支持不同地区的时间格式,也可以用Intl API: // return new Intl.DateTimeFormat('zh-CN', { hour: '2-digit', minute: '2-digit' }).format(rawValue); } } });
这种方法的好处是全局生效,所有查询该模型的操作都会自动返回HH:mm格式的字符串,不需要每次查询都额外处理。
方法二:查询时使用SQL Server的FORMAT函数(按需生效)
你提到的Sequelize返回类型FORMAT功能是完全可行的,我们可以通过sequelize.fn调用SQL Server内置的FORMAT函数,在数据库层面直接格式化字段:
const { fn, col } = require('sequelize'); const results = await YourModel.findAll({ attributes: [ // 其他需要查询的字段 'id', 'name', // 格式化userTime为HH:mm格式 [fn('FORMAT', col('userTime'), 'HH:mm'), 'userTime'] ] });
这种方法的优势是灵活性高,可以针对特定的查询进行格式化,不会影响其他查询的返回格式,适合只需要在部分场景下修改返回格式的需求。
两种方法的对比
- 模型Getter:全局统一格式,代码维护简单,适合所有查询都需要相同格式的场景。
- 查询时FORMAT:按需格式化,不影响全局模型定义,适合多场景格式需求的情况。
内容的提问来源于stack exchange,提问作者CoderX
相关产品推荐
相关产品推荐

