knex:选择特定日期范围内的行

时间:2018-07-26 15:38:14

标签: postgresql knex.js

如何使用knex查询从表中选择特定日期范围内的行?例如,选择最近7天中的行。

Knex版本:0.15.0

DB:PostgreSQL

5 个答案:

答案 0 :(得分:7)

您选择查询它们的任何方式都应该这样做,这是一种方法:

knex('table')
  .where('createdAt', '>=', '2009-01-01T00:00:00Z')
  .where('createdAt', '<', '2010-01-01T00:00:00Z')

答案 1 :(得分:3)

您也可以使用:

  const from = '2019-01-01';
  const to = '2019-02-02';

  knex('myTable')
    .select()
    .whereBetween('createdAt', [from, to]);

http://knexjs.org/#Builder-whereBetween

答案 2 :(得分:1)

您可以只使用Javascript Date()对象创建两个不同的时间戳,然后将它们转换为字符串。

    const currentDate = new Date()

    // Must convert to strings in case you need to prefix a '0' for single digit months or dates
    const currentYear = "" + currentDate.getUTCFullYear()
    const currentMonth = "" + (currentDate.getUTCMonth() + 1) //month indexed at 0
    const currentDay = "" + currentDate.getUTCDate()
    const currentHour = "" + currentDate.getUTCHours()
    const currentMinute = "" + currentDate.getUTCMinutes()
    const currentSeconds = "" + currentDate.getUTCSeconds()

    //Timestamp format: YYYY-MM-DDTHH:MM:SSZ
    const yesterdayTimestamp = `${currentYear}-` +
      // Ternaries are for prefixing a 0 to return values that are single digit
      `${currentMonth.length === 2 ? currentMonth : '0' + currentMonth}-` +
      `${currentDay.length === 2 ? currentDay : '0' + currentDay}T` +
      `${currentHour.length === 2 ? currentHour : '0' + currentHour}:` +
      `${currentMinute.length === 2 ? currentMinute : '0' + currentMinute}:` +
      `${currentSeconds.length === 2 ? currentSeconds : '0' + currentSeconds}Z`

    const lastWeek = new Date()
    lastWeek.setUTCDate(currentDate.getUTCDate() - 1)
    // Then do same string manipulations to create timestamp string for one week ago...

答案 3 :(得分:1)

在您的仓库中,只需放置以下where子句:

  MODEL.query()
          .where('created_at', '>=', '2009-01-01T00:00:00Z')
          .where('created_at', '<', new Date())
          .orderBy('created_at','desc|asc')

上面的代码对于获取从2009年1月1日到当前日期的所有记录很有用(您可以将新的Date()替换为想要记录的自己的日期)。

问题:如何从04/14/2020(MM / DD / YYYY)获得2009-01-01T00:00:00Z?

答案:

dateSplit = date.split("/");
            date = `${dateSplit[2]}-${dateSplit[0]}-${dateSplit[1]}`;
            date = date + "T00:00:00.000Z";

注意:不要忘了以MM / DD / YYYY发送日期。还解决了日期或时间显示为递增或递减的问题。

答案 4 :(得分:0)

如果您使用的是moment,则很容易实现所需的目标。 从您拥有的日期字符串中创建一个ISO 8601格式的日期。

let startDate = '2019-01-01';
startDate = moment(startDate).format('YYYY-MM-DDTHH:mm:ssZ');
let endtDate = '2019-10-01';
endDate = moment(endDate).format('YYYY-MM-DDTHH:mm:ssZ');

toISOString()方法将日期格式设置为YYYY-MM-DD[T]HH:mm:ss.SSS[Z],可与knex配合使用以查找时间范围内的记录。但是,相对于format(),我更喜欢toISOString()方法,因为format方法使用默认格式(YYYY-MM-DDTHH:mm:ssZ)而不使用毫秒,并且保持时区偏移。

现在,您可以在以下给出的startDateendDate的给定范围内找到相关记录,

knex('records')
  .where('created_at', '>=', startDate.toString())
  .where('created_at', '<', endDate.toString())
  .then((rows) => {
     /*
      * perform operations on record
      */
  })
  .catch((e) => {
       console.log(e);
  });

或者,您可以将knex中的whereBetween()用作

knex('records')
  .whereBetween('created_at', [startDate.toString() , endDate.toString()])
  .then((rows) => {
     /*
      * perform operations on record
      */
  })
  .catch((e) => {
       console.log(e);
  });
  

注意:在createdAt的最新版本中,created_at列名已替换为knex。在撰写此答案时,我使用了knex@0.19.1。但是仍然可以将createdAt与旧版本的knex一起使用。