Вернуть все результаты, если покупка совершена в течение 7 дней с даты регистрации

0

Я до сих пор приводил приведенный ниже код, чтобы попытаться собрать соответствующие данные.

Однако с помощью функции "+ 7" она выдает следующую проблему.

Registration date = '2018-01-01'

Он возвращает даты покупки 2018-04-08, т. 2018-04-08 тех 2018-04-08, пока день дня на 7 дней больше, чем считается приемлемым. Когда на самом деле я ищу все любые покупки в течение 7 дней с даты регистрации.

Любые советы/помощь будут высоко оценены.

select *
from purchases b
inner join registrations r
on r.customer_id = b.customer_id
and day(b.purchase_date) between d(r.account_opening_date) and day(r.account_opening_date) + 7
and r.account_opening_date >= '2018-01-01 00:00:00.0'
  • 0
    Так что, если +7 слишком много, пытались ли вы использовать +6 и 23:59:59 (то есть, менее 7 дней вместо меньше или равно)
  • 0
    ты пробовал без функции day ()? то, что вы делаете, это буквально проверяет только «день», а не всю дату
Теги:
date
inner-join
where-clause

4 ответа

0

Вы можете просто использовать +:

select *
from purchases b inner join
    registrations r
    on r.customer_id = b.customer_id and
       b.purchase_date >= r.account_opening_date and 
       b.purchase_date < r.account_opening_date + interval 7 day
where r.account_opening_date >= '2018-01-01';

Если вы хотите сделать это без компонента времени, используйте функцию date():

    on r.customer_id = b.customer_id and
       b.purchase_date >= r.account_opening_date and 
       b.purchase_date <= date(r.account_opening_date) + interval 7 day
where r.account_opening_date >= '2018-01-01'

Используете ли вы < или <= зависит от правильной интерпретации "в течение 7 дней". Эта версия предполагает, что вы действительно хотите 7-8 дней.

  • 0
    Прекрасное спасибо за вашу помощь, это здорово
0

вы можете использовать функцию окна

 select *
 partition by (order by account_opening_date rows 6 preceding)
 from purchases p, registrations r
 where p.customer_id = r.customer_id
 and r.account_opening_date >= '2018-01-01 00:00:00.0'
  • 0
    Большое спасибо очень полезно
0

Похоже, вам нужно использовать функции DATE_ADD и DATE MySQL.

select *
from purchases b
inner join registrations r
on r.customer_id = b.customer_id
and date(b.purchase_date) between date(r.account_opening_date) and date_add(r.account_opening_date interval 7 day)
and r.account_opening_date >= '2018-01-01 00:00:00.0'
  • 1
    Прекрасное спасибо за вашу помощь
  • 0
    Нет проблем, рад, что смог помочь
0

Вместо этого используйте DATE_ADD, DAY() не будет работать хорошо, когда даты для сравнения будут в разные месяцы.

AND b.purchase_date >= r.account_opening_date AND 
    b.purchase_date <= DATE_ADD(r.account_opening_date INTERVAL 7 Day)
  • 0
    Спасибо за вашу помощь, очень полезно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню