knexjs按日期和时间获取数据

时间:2018-08-26 15:22:49

标签: postgresql knex.js

我将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)

第二天才给我(第三个对象),我想要第二个和第三个对象。

1 个答案:

答案 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);
  })

希望这会有所帮助!