Как запросить диапазон дат, используя между в формате Varchar (10) мм/дд/гггг

Я пытаюсь показать только те записи, где «DateDue» находится в течение последнего года. Проблема в том, что моя дата находится в формате Varchar(10) в результате того, что мои потоки данных поступают в мою базу данных через определенные промежутки времени от поставщика. Очевидно, что с помощью этого запроса даты не фильтруются должным образом. Можно ли преобразовать это (временно для сравнения диапазона дат) в правильный тип данных даты для использования в запросе, но не навсегда изменить тип для этого столбца?

SELECT `DocNum`, `DateDue` 
FROM `prod_po_list` 
WHERE `DateDue` BETWEEN (DATE_FORMAT(curdate( ) - INTERVAL 365 DAY , '%m/%d/%Y' ))
AND DATE_FORMAT( CURDATE( ) , '%m/%d/%Y' )

person Tim S    schedule 04.06.2013    source источник


Ответы (2)


Вы ищете что-то подобное?

 SELECT DocNum, DateDue 
 FROM prod_po_list
 WHERE STR_TO_DATE(DateDue, '%m/%d/%Y')
       BETWEEN DATE_SUB(CURDATE(), INTERVAL 365 DAY)
       AND CURDATE()
person Yogendra Singh    schedule 04.06.2013
comment
Возможно, но я получаю: #1582 - Неверный счетчик параметров в вызове нативной функции 'STR_TO_DATE' - person Tim S; 05.06.2013
comment
@TimS ой, не хватает одной запятой (STR_TO_DATE(DateDue, '%m/%d/%Y')). Исправил. - person Yogendra Singh; 05.06.2013
comment
Спасибо. Теперь я получаю другую ошибку: #1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с ') AND CURDATE() - person Tim S; 05.06.2013
comment
О, я вижу... это дополнительная открывающая скобка после Date_Sub( - теперь работает - person Tim S; 05.06.2013
comment
@TimS Спасибо! Я удалил лишнюю скобку из ответа. Если вы считаете, что это было полезно, не забудьте принять ответ, чтобы закрыть тему. - person Yogendra Singh; 05.06.2013

Если у вас есть индекс столбца даты, это будет полезно

SELECT DocNum, DateDue 
 FROM prod_po_list
 WHERE DateDue >= DATE_SUB(CURDATE(), INTERVAL 365 DAY)
       AND DateDue <= CURDATE()
person Madhivanan    schedule 12.10.2013