Я нашел вопрос это может объяснить, что я получаю в результате. Но все же это кажется странным поведением.
У нас есть таблица, заполненная продуктами поставщиков, которая обновляется каждый день (новые данные читаются из xml). Столбец «обновленный» получает новое значение даты и времени в процессе. Продукты, которые исчезают из XML-файла поставщика, должны быть помечены EOL в столбце «флаг»
После импорта из XML-файла я запускаю следующий SQL, чтобы попытаться найти продукты, которые должны быть помечены как EOL.
SELECT * FROM `app_supplier_products` WHERE `flag` != 'EOL' AND `supplier_id` = 1 AND `updated` < '2014-12-29 07:15:01'
Однако это не вернуло никаких строк. Если мы изменили время на 07:15:15, мы бы получили результаты. Казалось, что сравнение меньше, чем не вернуть строки из другого дня.
После выполнения некоторых других тестов нам удалось заставить его работать со следующим SQL:
SELECT * FROM `app_supplier_products` WHERE (`flag` IS NULL OR `flag` = 'MODIFIED') AND `supplier_id` = 1 AND `updated` < '2014-12-29 07:15:01'
На этом этапе столбец флага может быть NULL, MODIFIED или EOL. В будущем мы могли бы добавить другие возможные значения. Это означает, что нам нужно будет обновить все запросы, когда мы добавим другое значение.
Почему первый запрос не возвращает ожидаемые строки?
Измените запрос на:
SELECT * FROM `app_supplier_products` WHERE NOT (`flag` <=> 'EOL') AND `supplier_id` = 1 AND `updated` < '2014-11-29 07:15:01'
Это использует нулевое безопасное равенство оператор, поэтому он будет соответствовать строк, где flag = NULL
,
Если вы не можете использовать этот оператор, вы можете использовать:
SELECT * FROM `app_supplier_products` WHERE (`flag` IS NULL OR FLAG != 'EOL') AND `supplier_id` = 1 AND `updated` < '2014-11-29 07:15:01'
Других решений пока нет …