尝试使用 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 查询

带有 Knex.js 的 select 语句的子查询

带有 Express 的 Knex.js,如何在 knex.commit 后跟 knex.select 查询?

Bookshelf.js / Knex.js 嵌套在单个查询中的位置

Knex.js 会阻止 sql 注入吗?