ВЫБЕРИТЕ c.id ГДЕ org_id = x И все столбцы даты (NULL или < DATE_SUB(NOW(),ИНТЕРВАЛ 2 ГОДА)?

#mysql #sql

#mysql #sql

Вопрос:

У меня есть таблица контактов:

 id    org_id    date1        date2        date3 
------------------------------------------------------
1     345       22-01-2020   01-01-2019   NULL
2     567       31-01-2018   NULL         24-05-2019
  

Я хочу выбрать c.id

 where org_id = 354 AND all date columns are (NULL or < DATE_SUB(NOW(),INTERVAL 2 YEAR)
  

Я не могу получить больше, чем это:

 SELECT id FROM contacts
WHERE (cc.crm_organisation_id = 152 AND (cc.last_login IS NULL OR cc.last_login < DATE_SUB(NOW(),INTERVAL 2 YEAR)))  
OR (cc.crm_organisation_id = 152 AND (cc.last_login_rip IS NULL OR cc.last_login_rip < DATE_SUB(NOW(),INTERVAL 2 YEAR)))  
OR (cc.crm_organisation_id = 152 AND (cc.last_login_ripfa IS NULL OR cc.last_login_ripfa < DATE_SUB(NOW(),INTERVAL 2 YEAR)))  
OR (cc.crm_organisation_id = 152 AND (cc.created IS NULL OR cc.created < DATE_SUB(NOW(),INTERVAL 2 YEAR)))
OR (cc.crm_organisation_id = 152 AND (cc.modified IS NULL OR cc.modified < DATE_SUB(NOW(),INTERVAL 2 YEAR)))
  

Спасибо за любую помощь!

Ответ №1:

Это более простой способ сделать это:

 SELECT id 
FROM contacts 
WHERE org_id = 152 
AND GREATEST(
      COALESCE(date1, '1000-01-01'), 
      COALESCE(date2, '1000-01-01'), 
      COALESCE(date3, '1000-01-01')
    ) < CURRENT_DATE - INTERVAL 2 YEAR
  

потому что, если максимум из 3 дат меньше, чем 2 года назад, то все даты меньше, чем 2 года назад.

Комментарии:

1. Я получаю сообщение об ошибке в последней строке: «У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с ‘) < CURRENT_DATE — ИНТЕРВАЛ 2 ГОДА’ в строке 1 Должен ли я установить конкретную дату в строках ОБЪЕДИНЕНИЯ?

2. @BenjaminWhitehouse Проверьте это: dbfiddle.uk /… в моем запросе нет синтаксической ошибки. Вы правильно его используете?

3. @BenjaminWhitehouse отлично, если это сработало, и не забудьте принять ответ, нажав на галочку.

Ответ №2:

Как насчет этого?

 select id
from contacts
where crm_organisation_id = 152 and
      ( (last_login is null or last_login < curdate() - interval 2 year) or
        (last_login_ripfa is null or last_login_ripfa < curdate() - interval 2 year) or
        (created is null or created < curdate() - interval 2 year) or
        (modified is null or modified < curdate() - interval 2 year) 
      );