我们需要以特定格式而不是默认格式对返回日期进行续集。据我所知,没有办法在选项或任何其他方式中设置它。每次检索后都没有手动更新日期,任何人都能够轻松解决这个问题?还是我错过了什么?
6 回答
您可以使用 Sequelizefn
方法。从API Reference中,该fn
函数将帮助在查询中创建一个表示 SQL 函数的对象。
例如:
model.findAll({
attributes: [
'id',
[sequelize.fn('date_format', sequelize.col('date_col'), '%Y-%m-%d'), 'date_col_formed']
]})
.then(function(result) {
console.log(result);
});
将返回数据值:
[
{"id": 1, "date_col_formed": "2014-01-01"},
{"id": 2, "date_col_formed": "2014-01-02"}
// and so on...
]
21/06/2019
有点晚了,但提供了更新。
Sequelize 是一个强大的 ORM(我并不是说它是最好的解决方案),但文档非常糟糕。
无论如何,如果你想在你的模型中配置这个,除了必须在你的查询中重复这个之外,因为其他响应表明你可以这样做:
const Test = sequelize.define('test', {
// attributes
name: {
type: DataType.STRING,
allowNull: false
},
createdAt: {
type: DataType.DATE,
//note here this is the guy that you are looking for
get() {
return moment(this.getDataValue('createdAt')).format('DD/MM/YYYY h:mm:ss');
}
},
updatedAt: {
type: DataType.DATE,
get() {
return moment(this.getDataValue('updatedAt')).format('DD/MM/YYYY h:mm:ss');
}
}
如果您使用日期来提供信息:上次更新、首次登录、上次登录。这是要走的路。
函数 get 返回新的格式化元素,因此它也不应该被限制为日期!请记住,这会减慢您的查询速度,因此请谨慎使用。;)
更多信息(我知道我知道,但 docs 是游戏的名称):http ://docs.sequelizejs.com/manual/models-definition.html#getters--amp--setters
您可以定义自定义实例方法 getDate/setDate ,它将在续集内部表示和所需格式之间转换日期,如https://sequelize.org/master/manual/model-basics.html#taking-advantage-of-models-being-班级
如果您想将其转换为VARCHAR
:
attributes:{include:[[sequelize.cast(sequelize.col('dob'), 'VARCHAR') , 'dob']],exclude:['dob']}
要格式化日期,您可以使用 Sequelize.fn 方法。我尝试了所有提到的方法,但它不适用于 date_format。尝试用波纹管创建。
model.findAll({
attributes: [
'id',
[sequelize.fn('FORMAT', sequelize.col('col_name'), 'yyyy-mm-dd'), 'col_name']
]})
.then(function(result) {
console.log(result);
});
在这里,我使用了“FORMAT”而不是“DATE_FORMAT”,因为它通过错误:“date_format”不是 api 调用中可识别的内置函数名。
如果是我们使用 Sequelize CLI 创建的模型,请尝试这样的操作
var sequelize= require('../models');
model.findAll({
attributes: [
'id',
'title'
[sequelize.Sequelize.fn('date_format', sequelize.Sequelize.col('col_name'), '%d %b %y'), 'col_name']
]}.then(function(result))
{ // dateformate=04 Nov 2017
console.log(result)
}