我将knexjs与postgrsql一起使用,并且试图通过所有日期和时间来获取数据,而该日期和时间要远大于当前日期和时间。 例如我有这个数据
tasklist
所以我只想获取第二个和第三个对象,因为现在是2018-08-2018,时间是:18:20pm。 我将时间和日期存储为字符串(对我来说,使用它很容易)
我的查询是
{
"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"
}
如果我发送正确的参数,例如user_id = 1,它将给我空数组 但是如果我删除时间线
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)
第二天才给我(第三个对象),我想要第二个和第三个对象。
答案 0 :(得分:2)
由于您分别处理日期和时间,因此需要处理时间少于所需时间且日期晚于所需日期的情况。
在查询中,在任何晚于所需日期的日期,但在所需时间之前的时间(在那些较晚的日期),您都将不适当地排除这些记录。尝试更改:
.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);
})
希望这会有所帮助!