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

watbbzwu  于 2023-02-04  发布在  PostgreSQL
关注(0)|答案(5)|浏览(163)

如何使用knex查询从表中选择特定日期范围内的行?例如,选择最近七天的行。
膝关节版本:0.15.0
数据库:PostgreSQL

wqnecbli

wqnecbli1#

无论您选择哪种方式来查询它们,下面是一种方法:

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

mnemlml82#

您还可以使用:

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

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

knex.js whereBetween文件

6jjcrrmo

6jjcrrmo3#

如果你使用的是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的X1 M10 N1 X,

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。但是你仍然可以在旧版本的knex中使用createdAt

fzsnzjdm

fzsnzjdm4#

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

mklgxw1f5#

在您的回购协议中,只需将这些子句放在何处:

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()替换为您想要记录的日期)。
问题:如何从2020年4月14日(年/月/日)获取2009年1月1日01时00分00秒?

    • 答案:**
dateSplit = date.split("/");
            date = `${dateSplit[2]}-${dateSplit[0]}-${dateSplit[1]}`;
            date = date + "T00:00:00.000Z";
  • 注意:不要忘记发送月/日/年的日期。它还解决了日期或时间显示为递增或递减的问题。*

相关问题