Проблема с преобразованием из базы данных ms в MySQL между двумя датами

#mysql #database #ms-access

#mysql #База данных #ms-access

Вопрос:

Я конвертирую ms в MySQL и сталкиваюсь со следующей проблемой, вот мой запрос ms:

 FROM `history_card`
GROUP BY `history_card`.`SERIAL_NUMBER`
HAVING (((LAST(`history_card`.`DUE_CAP_CHECK_DATE`)) Between Date() And Date()-60))
ORDER BY LAST(`history_card`.`DUE_CAP_CHECK_DATE`) DESC;
  

это дает мне 13 записей
, вот MySQL:

 FROM `history_card`
GROUP BY `history_card`.`SERIAL_NUMBER`
HAVING (((MAX(`history_card`.`DUE_CAP_CHECK_DATE`)) BETWEEN  (MAX(`history_card`.`DUE_CAP_CHECK_DATE`)) AND DATE_ADD((MAX(`history_card`.`DUE_CAP_CHECK_DATE`)), INTERVAL -60 DAY) ))
ORDER BY MAX(`history_card`.`DUE_CAP_CHECK_DATE`) DESC;
  

итак, проблема с BETWEEN, как я могу сделать Mysql эквивалентом: Between Date() And Date()-60) Я попробовал это:

 BETWEEN  (MAX(`history_card`.`DUE_CAP_CHECK_DATE`)) AND DATE_ADD((MAX(`history_card`.`DUE_CAP_CHECK_DATE`)), INTERVAL -60 DAY)
  

но он не возвращает никаких записей

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

1. Попробуйте написать что-то, что сначала компилируется. Date() это не функция T-SQL. Также попробуйте исправить сам запрос. Фильтрация в HAVING предложении принудительно выполняет полное сканирование таблицы в обеих базах данных. Вы ищете последнюю запись для каждого серийного номера, который попадает в диапазон? Почему бы не использовать WHERE then?

2. да, я хочу получить последние записи, должен ли я использовать WHERE вместо HAVING?

3. Date() в ms access возвращает текущую дату. В MySQL функция curdate() делает то же самое.

Ответ №1:

Я думаю, это то, что вы хотите (изменение формата для ясности):

      FROM  `history_card`
 GROUP BY  `history_card`.`SERIAL_NUMBER`
   HAVING  MAX( `history_card`.`DUE_CAP_CHECK_DATE` )
              BETWEEN CURDATE() 
              AND DATE_ADD( CURDATE(), INTERVAL -60 DAY )     
 ORDER BY  MAX( `history_card`.`DUE_CAP_CHECK_DATE` ) DESC;