gpt4 book ai didi

node.js - 使用sequelize 比较查询中日期的当前年份和月份

转载 作者:太空宇宙 更新时间:2023-11-03 23:20:46 25 4
gpt4 key购买 nike

我的架构如下:

测试

const test = sequelize.define('test', {
id: {primaryKey: true, type: DataTypes.INTEGER, autoIncrement: true, allowNull: false, unique: true},
start_date: {type: DataTypes.DATE},
});


return test

现在在不同的行中,我的start_date为2018-05-05,2018-05-06和2018-06-06。现在我想要的是,我想得到结果2018-05-05 和 2018-05-06,分别是当月和当年。我应该如何将查询放在 Sequelize 中?

最佳答案

如果您询问如何选择日期,那么只要您始终使用提供的 JavaScript Date 对象和列的 DATE 类型,那么简单的范围选择只需提供日期并使用范围运算符(例如 $gte$lte)

const { Op } = Sequelize = require('sequelize');

let query = {
where: {
start_date: {
[Op.gte]: new Date("2018-03-01"),
[Op.lt]: new Date("2018-04-01")
}
}
};

let data = await DateTest.findAll(query);

当然,首选的 Symbol 实现需要现代的 Nodejs 环境来支持对象表示法。如果你没有,那么你仍然可以使用“字符串”:

let query = {
where: {
start_date: {
'$gte': new Date("2018-03-01"),
'$lt': new Date("2018-04-01")
}
}
};

如果您想对具有 DATE 类型的列进行GROUP BY,则方法实际上会有所不同,具体取决于后端的数据库引擎,因此最好通过完整的列表进行演示:

SQLite 语法

const { Op } = Sequelize = require('sequelize');

const log = data => console.log(JSON.stringify(data, undefined, 2));
const sequelize = new Sequelize('sqlite:dates.db', { logging: log });

const DateTest = sequelize.define('DateTest', {
start_date: Sequelize.DATE
});

(async function() {

try {

await sequelize.authenticate();
await DateTest.sync({ force: true });

let result = await sequelize.transaction(transaction =>
Promise.all(
['2018-03-01','2018-03-01T01:12:23.000Z','2018-04-01'].map(d =>
DateTest.create({ start_date: new Date(d) },{ transaction })
)
)
);

let query = {
attributes: [
[
sequelize.fn('strftime', '%Y-%m-%d', sequelize.col('start_date')),
'date'
],
[sequelize.fn('count','*'),'count']
],
group: [sequelize.col('date')],
where: {
start_date: {
[Op.gte]: new Date("2018-03-01"),
[Op.lt]: new Date("2018-04-01")
}
}
};



console.log(query);
let data = await DateTest.findAll(query);
log(data);

} catch(e) {
console.error(e)
} finally {
process.exit()
}

})()

PostgreSQL 语法

const { Op } = Sequelize = require('sequelize');

const uri = 'postgres://user:password@localhost/database';

const log = data => console.log(JSON.stringify(data, undefined, 2));
const sequelize = new Sequelize(uri, { logging: log });

const DateTest = sequelize.define('DateTest', {
start_date: Sequelize.DATE
});

(async function() {

try {

await sequelize.authenticate();
await DateTest.sync({ force: true });

let result = await sequelize.transaction(transaction =>
Promise.all(
['2018-03-01', '2018-03-01T01:12:23.000Z','2018-04-01'].map(d =>
DateTest.create({ start_date: new Date(d) },{ transaction })
)
)
);

let query = {
attributes: [
[
sequelize.fn('date_trunc', 'day', sequelize.col('start_date')),
'date'
],
[sequelize.fn('count','*'),'count']
],
group: [
sequelize.col('date')
],
where: {
start_date: {
[Op.gte]: new Date("2018-03-01"),
[Op.lt]: new Date("2018-04-01")
}
}
};



console.log(query);
let data = await DateTest.findAll(query);
log(data);

} catch(e) {
console.error(e)
} finally {
process.exit()
}

})()

实际上,date_trunc() 应该可以与各种 SQL RDBMS 后端配合使用,但值得注意的是不能与 SQLite 配合使用,以防万一您考虑用于测试目的(如果不是“lite”发行版)。

两种形式都会输出:

[
{
"date": "2018-03-01",
"count": 2
}
]

表示我们仅使用查询条件从插入的样本中“选择”出现在 3 月份的日期,并使用 GROUP BY 我们按“天”截断,以达到给定日期的预期总计数 2

关于node.js - 使用sequelize 比较查询中日期的当前年份和月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50180452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com