knexjs 按日期和时间获取数据
knexjs get data by date and time
我正在将 knexjs 与 postgrsql 一起使用,并且我正在尝试获取比当前日期和时间早的所有日期和时间的数据。
例如我有这个数据
{
"appointment_id": 1,
"barber_id": 1,
"user_id": 1,
"service_id": 1,
"user_arrive": false,
"created_at": "2018-08-26T13:38:47.342Z",
"updated_at": "2018-08-26T13:38:47.342Z",
"slot": 0,
"time": "09:00",
"date": "2018-08-26"
},
{
"appointment_id": 1,
"barber_id": 1,
"user_id": 1,
"service_id": 1,
"user_arrive": false,
"created_at": "2018-08-26T13:38:47.342Z",
"updated_at": "2018-08-26T13:38:47.342Z",
"slot": 2,
"time": "19:00",
"date": "2018-08-26"
},
{
"appointment_id": 2,
"barber_id": 1,
"user_id": 1,
"service_id": 1,
"user_arrive": false,
"created_at": "2018-08-26T14:19:24.284Z",
"updated_at": "2018-08-26T14:19:24.284Z",
"slot": 0,
"time": "09:00",
"date": "2018-08-27"
}
所以我只想得到第二个和第三个对象,因为现在是 2018-08-2018,时间 is:18:20pm。
我将我的时间和日期存储为字符串(对我来说很容易使用)
我的查询是
let date = moment().format('YYYY-MM-DD')
let time = moment().format('HH:mm')
console.log('date',time , 'user_id',user_id)
return knex('appointments')
.where('user_id',user_id)
.andWhere('date','>',date)
.andWhere('time','>',time)
如果我发送正确的参数,如 user_id =1,它会给我一个空数组
但是如果我删除时间线
.andWhere('time','>',time)
它只在第二天给我(第三个对象),我想要第二个和第三个。
由于您分别处理日期和时间,因此您需要处理时间小于所需时间且日期晚于所需日期的情况。
在您的查询中,对于晚于所需日期的任何日期,但时间早于所需时间(在那些较晚的日期),您将不适当地排除这些记录。尝试更改:
.andWhere('date','>',date)
.andWhere('time','>',time)
改为:
.andWhere(function() {
this.where('date','>',date)
.orWhere(function() {
this.where('date','=',date)
.andWhere('time','>',time) })
})
此外,我使用以下子句来帮助调试我在 Knex 中的 SQL 语句,以确保它生成我期望的 SQL,这不是针对你的问题但总是很有用。
.on('query', function(data) {
console.log('debug query:', data);
})
完整示例:
let date = moment().format('YYYY-MM-DD')
let time = moment().format('HH:mm')
console.log('date',time , 'user_id',user_id)
return knex('appointments')
.where('user_id',user_id)
.andWhere(function() {
this.where('date','>',date)
.orWhere(function() {
this.where('date','=',date)
.andWhere('time','>',time) })
})
.on('query', function(data) {
console.log('debug query:', data);
})
希望对您有所帮助!
我正在将 knexjs 与 postgrsql 一起使用,并且我正在尝试获取比当前日期和时间早的所有日期和时间的数据。 例如我有这个数据
{
"appointment_id": 1,
"barber_id": 1,
"user_id": 1,
"service_id": 1,
"user_arrive": false,
"created_at": "2018-08-26T13:38:47.342Z",
"updated_at": "2018-08-26T13:38:47.342Z",
"slot": 0,
"time": "09:00",
"date": "2018-08-26"
},
{
"appointment_id": 1,
"barber_id": 1,
"user_id": 1,
"service_id": 1,
"user_arrive": false,
"created_at": "2018-08-26T13:38:47.342Z",
"updated_at": "2018-08-26T13:38:47.342Z",
"slot": 2,
"time": "19:00",
"date": "2018-08-26"
},
{
"appointment_id": 2,
"barber_id": 1,
"user_id": 1,
"service_id": 1,
"user_arrive": false,
"created_at": "2018-08-26T14:19:24.284Z",
"updated_at": "2018-08-26T14:19:24.284Z",
"slot": 0,
"time": "09:00",
"date": "2018-08-27"
}
所以我只想得到第二个和第三个对象,因为现在是 2018-08-2018,时间 is:18:20pm。 我将我的时间和日期存储为字符串(对我来说很容易使用)
我的查询是
let date = moment().format('YYYY-MM-DD')
let time = moment().format('HH:mm')
console.log('date',time , 'user_id',user_id)
return knex('appointments')
.where('user_id',user_id)
.andWhere('date','>',date)
.andWhere('time','>',time)
如果我发送正确的参数,如 user_id =1,它会给我一个空数组 但是如果我删除时间线
.andWhere('time','>',time)
它只在第二天给我(第三个对象),我想要第二个和第三个。
由于您分别处理日期和时间,因此您需要处理时间小于所需时间且日期晚于所需日期的情况。
在您的查询中,对于晚于所需日期的任何日期,但时间早于所需时间(在那些较晚的日期),您将不适当地排除这些记录。尝试更改:
.andWhere('date','>',date)
.andWhere('time','>',time)
改为:
.andWhere(function() {
this.where('date','>',date)
.orWhere(function() {
this.where('date','=',date)
.andWhere('time','>',time) })
})
此外,我使用以下子句来帮助调试我在 Knex 中的 SQL 语句,以确保它生成我期望的 SQL,这不是针对你的问题但总是很有用。
.on('query', function(data) {
console.log('debug query:', data);
})
完整示例:
let date = moment().format('YYYY-MM-DD')
let time = moment().format('HH:mm')
console.log('date',time , 'user_id',user_id)
return knex('appointments')
.where('user_id',user_id)
.andWhere(function() {
this.where('date','>',date)
.orWhere(function() {
this.where('date','=',date)
.andWhere('time','>',time) })
})
.on('query', function(data) {
console.log('debug query:', data);
})
希望对您有所帮助!