Запрос MySQL — не между двумя датами

#mysql

#MySQL

Вопрос:

Я пытаюсь запустить запрос, который выбирает всех пользователей, которые не входили в систему в течение двух месяцев ( last_access ), insert_date не в течение двух месяцев с сегодняшнего дня и status не 2.

last_access И insert_date являются обоими datetime .

Это код, который у меня есть;

 SELECT * 
FROM `wp_SDzEBA_pc_users`
WHERE `last_access` NOT BETWEEN NOW() - INTERVAL 2 MONTH AND NOW()
AND `insert_date` NOT BETWEEN NOW() - INTERVAL 2 MONTH AND NOW()
AND `status` <> 2
  

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

Что я делаю не так?

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

1. Ваш код должен работать. Пожалуйста, предоставьте образцы данных, текущие и желаемые результаты в виде табличного текста.

2. Пример даты, которую он возвращает в запросе 2020-10-17 10:51:00 , — может быть, мне нужно как-то сделать NOW() 1 день, потому что может быть разница между датой сервера? @GMB

3. Я думаю NOW() INTERVAL 1 DAY , что проблема действительно устранена

Ответ №1:

Я бы не стал использовать between для этого. Одно условие неравенства кажется более подходящим:

 SELECT * 
FROM `wp_SDzEBA_pc_users`
WHERE 
    `last_access` < NOW() - INTERVAL 2 MONTH
    AND `insert_date` < NOW() - INTERVAL 2 MONTH
    AND `status` <> 2
  

В основном это дает пользователям, которые не подключались в течение последних двух месяцев, и которые были вставлены более двух месяцев назад.

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

 SELECT * 
FROM `wp_SDzEBA_pc_users`
WHERE 
    (`last_access` IS NULL OR `last_access` < NOW() - INTERVAL 2 MONTH)
    AND `insert_date` < NOW() - INTERVAL 2 MONTH
    AND `status` <> 2