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

希望对您有所帮助!