尝试使用 Knex.js 构建查询以获取两个月之间的行数
Posted
技术标签:
【中文标题】尝试使用 Knex.js 构建查询以获取两个月之间的行数【英文标题】:Trying to build query to get number of rows between two months using Knex.js 【发布时间】:2020-05-08 12:31:27 【问题描述】:我有一个问题跟踪管理程序,我正在尝试构建一个 SQL 查询来返回每个月的行数组。
我尝试使用 while 循环来循环遍历并在每个行之后推送行的长度。但是,它会在循环完成之前返回数组。
我知道我也可以使用 count() 来获取行长,但我只需要获取 1-6 之间的月份;
有没有更容易使用的查询?
getMonthlyData(db, teamId)
let monthlyData = [];
let i = 1;
while (i < 6)
db
.from('issues')
.select('*')
.where(team_id: teamId)
.andWhereRaw(`EXTRACT(MONTH FROM date_created::date) = ?`, [i])
.then(rows =>
console.log('Monthly data')
console.log(rows);
monthlyData.push(rows.length)
)
.catch((e) =>
console.log(e);
)
return monthlyData;
谢谢
【问题讨论】:
所以你想要所有年份的第 1-6 个月的问题?此外,您可能需要根据问题跟踪器的时区将 date_created 转换为某个本地时区。除非 date_created 实际上存储为本地时间而不是 UTC。 此外,代码似乎有一个错误,即变量i
永远不会递增,并且您实际上并未从 getMonthlyData
返回一个 Promise,因此您将在查询完成之前返回一个空结果。
【参考方案1】:
相当于您的查询已修复异步错误,并且作为单个查询应该是:
async getMonthlyData(db, teamId)
return db('issues')
.where(team_id: teamId)
.whereBetween(db.raw(`EXTRACT(MONTH FROM date_created::date)`), [1,6]);
另一种写法是用一个额外的列来说明提取的月份:
async getMonthlyData(db, teamId)
// after this query you can easily group the resulted issues by month
return db('issues')
.select('*', db.raw(`EXTRACT(MONTH FROM date_created::date) as month`))
.where(team_id: teamId)
.whereBetween(month, [1,6]);
【讨论】:
以上是关于尝试使用 Knex.js 构建查询以获取两个月之间的行数的主要内容,如果未能解决你的问题,请参考以下文章
使用 Oracle 程序 - Node.js Knex.js
无法使用 knex.js 中的连接复制 PostgresQL 查询
带有 Express 的 Knex.js,如何在 knex.commit 后跟 knex.select 查询?