knexjs получает данные по дате и времени - PullRequest
0 голосов
/ 26 августа 2018

Я использую 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, а время: 18: 20. Я храню свое время и дату в виде строки (мне было легко с ней работать)

мой запрос

 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)

это даст мне только на следующий день (третий объект), а я хочу второй и третий.

1 Ответ

0 голосов
/ 27 августа 2018

Поскольку вы обрабатываете даты и время отдельно, вам нужно обработать случай, когда время меньше, чем желаемое время, а дата - после желаемой даты.

В вашем запросе, на любые даты позжечем желаемая дата, но со временем до желаемого времени (в те более поздние даты), вы будете ненадлежащим образом исключать эти записи.Попробуйте изменить:

.andWhere('date','>',date)
.andWhere('time','>',time)

вместо:

.andWhere(function() {
    this.where('date','>',date)
    .orWhere(function() {
        this.where('date','=',date)
        .andWhere('time','>',time) })
})

Кроме того, не к вашему вопросу, но всегда весьма полезно, я использую следующее предложение, чтобы помочь в отладке моих операторов SQL в Knex:чтобы убедиться, что он генерирует ожидаемый 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);
  })

Надеюсь, это поможет!

...