【问题标题】:knex: select rows that are in certain date rangeknex:选择特定日期范围内的行
【发布时间】:2019-01-03 16:16:33
【问题描述】:

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

Knex 版本:0.15.0

数据库:PostgreSQL

【问题讨论】:

  • 有些情况下whereRaw是你的朋友。
  • 是的,看来我将不得不使用 whereRaw

标签: postgresql knex.js


【解决方案1】:

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

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

【讨论】:

  • 它适用于特定的时间戳。我总是想从当前时间戳开始选择过去 7 天的行。也许我可以使用moment 来获取当前时间戳并与那个进行比较?
  • 这是一种方法。
【解决方案2】:

你也可以使用:

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

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

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

【讨论】:

    【解决方案3】:

    您可以使用 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...
    

    【讨论】:

      【解决方案4】:

      在你的回购中,只需将这些 where 子句:

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

      以上代码可用于获取从 2009-01-01 到当前日期的所有记录(您可以将 new 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 中发送日期。它还解决了日期或时间显示为递增或递减的问题。

      【讨论】:

        【解决方案5】:

        如果您使用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);
          });
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-16
          • 1970-01-01
          • 1970-01-01
          • 2019-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多