Используйте ваш второй вариант, но проверьте правильность значения.
WHERE a.`user_id` = pUSERID
AND (pNAME IS NULL OR a.called_name = pNAME)
AND a.duration <> 0 AND DATE_FORMAT(a.start_datetime , "%m/%d/%Y") BETWEEN pSTART AND pEND
Во втором условии обратите внимание, что я перевернул условия.
Это не является строго необходимым, потому чтооптимизатор должен обрезать любое условие, в котором нет необходимости, но это проясняет ваши намерения по короткому замыканию.
Обратите также внимание, что NULL
не эквивалентно пустой строке и ничто не равно NULL
, поэтому IS NULL
следует использовать, если NULL - это то, с чем вы сопоставляете.
Я не знаю, что вы делаете с DATE_FORMAT()
здесь, но не делайте этого.
Используйте правильноdatetime везде или используйте STR_TO_DATE()
для преобразования параметров, а не DATE_FORMAT()
для столбца.Вы не можете сравнить мм / дд / гггг "между" двумя значениями.Это не имеет смысла.12/09/2010 "между" 08.12.2017 и 12.10.2017, потому что ваш код сравнивает строки, лексически, а не сравнивает даты.
Как правило, вы никогда не должны использовать столбец какаргумент для функции в WHERE
, потому что это побеждает любые индексы в столбце и вызывает полное сканирование.