如何使用knex查询从表中选择特定日期范围内的行?例如,选择最近七天的行。膝关节版本:0.15.0数据库:PostgreSQL
wqnecbli1#
无论您选择哪种方式来查询它们,下面是一种方法:
knex('table') .where('createdAt', '>=', '2009-01-01T00:00:00Z') .where('createdAt', '<', '2010-01-01T00:00:00Z')
mnemlml82#
您还可以使用:
const from = '2019-01-01'; const to = '2019-02-02'; knex('myTable') .select() .whereBetween('createdAt', [from, to]);
knex.js whereBetween文件
whereBetween
6jjcrrmo3#
如果你使用的是moment,那么你想要得到的结果会非常容易。从你的日期字符串中创建一个ISO 8601的日期。
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),没有毫秒,并且维护时区偏移。现在,您可以在startDate和endDate的给定范围内找到相关记录,如下所示。
toISOString()
YYYY-MM-DD[T]HH:mm:ss.SSS[Z]
knex
format()
format
startDate
endDate
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。
createdAt
created_at
knex@0.19.1
fzsnzjdm4#
您可以使用Javascript Date()对象创建两个不同的时间戳,并将它们转换为字符串。
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...
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";
5条答案
按热度按时间wqnecbli1#
无论您选择哪种方式来查询它们,下面是一种方法:
mnemlml82#
您还可以使用:
knex.js
whereBetween
文件6jjcrrmo3#
如果你使用的是
moment
,那么你想要得到的结果会非常容易。从你的日期字符串中创建一个ISO 8601
的日期。toISOString()
方法会将日期格式化为YYYY-MM-DD[T]HH:mm:ss.SSS[Z]
,可以与knex
一起使用来查找时间范围内的记录,但是我更喜欢format()
方法而不是toISOString()
,因为format
方法使用默认格式(YYYY-MM-DDTHH:mm:ssZ),没有毫秒,并且维护时区偏移。现在,您可以在
startDate
和endDate
的给定范围内找到相关记录,如下所示。或者可选地,可以使用来自KNEX的X1 M10 N1 X,
注意:在
knex
的最新版本中,createdAt
列名被替换为created_at
。在写这个答案的时候,我使用了knex@0.19.1
。但是你仍然可以在旧版本的knex中使用createdAt
。fzsnzjdm4#
您可以使用Javascript
Date()
对象创建两个不同的时间戳,并将它们转换为字符串。mklgxw1f5#
在您的回购协议中,只需将这些子句放在何处:
上面的代码对于获取从2009 - 01 - 01到正在进行的日期的所有记录非常有用(您可以将new Date()替换为您想要记录的日期)。
问题:如何从2020年4月14日(年/月/日)获取2009年1月1日01时00分00秒?