2015-03-29 2 views
0

Существует таблица с полем DATETIME с именем «created_at». Я пытаюсь выполнить два запроса, как это:STR_TO_DATE() vs CONSTANT при сравнении поля DATETIME

  1. SELECT * FROM myTable WHERE created_at BETWEEN '2015-03-15 10:25:00' AND '2015-03-25 10:30:00';
  2. SELECT * FROM myTable WHERE created_at BETWEEN STR_TO_DATE('2015-03-15 10:25:00', '%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2015-03-25 10:30:00', '%Y-%m-%d %H:%i:%s');

Я всегда использовал первый запрос, но недавно наткнулся на статью, в которой описывается, что второй подход является лучшим способом для сравнения DATETIME. К сожалению, в нем нет никаких объяснений, почему этот подход является наилучшим способом.

Теперь у меня есть несколько вопросов:

  • есть ли разница между этими двумя подходами?
  • Какой способ предпочтительнее?

Спасибо!

ответ

2

Я предпочитаю прямо устанавливать константы. Я считаю, что MySQL будет обрабатывать функцию str_to_date() только один раз для запроса, потому что аргументы являются константами. Тем не менее, я не люблю зависеть от этой оптимизации.

Преимущество str_to_date() заключается в том, что оно не зависит от настроек интернационализации, поэтому результат должен быть однозначным. Однако использование стандартных форматов ISO должно быть эквивалентным, и это структура ваших констант.

Однако, это в сторону, лучший способ написать запрос является:

SELECT * 
FROM myTabl 
WHERE created_at >= '2015-03-15 10:25:00' AND 
     created_at < '2015-03-25 10:30:00' 

Я предполагаю, что вы действительно не хотите 10 дней, пять минут и одну секунду в интервале, но хотят точно 10 дней и 5 минут. В любом случае, использование between с датами и DateTimes может привести к неожиданным результатам, особенно, когда вы делаете:

where datetime between '2015-03-15' and '2015-03-16' 

Если вы думаете, что вы получаете две даты, то вы ошибаетесь. Вы получаете все даты в первый день плюс полуночи на втором.

 Смежные вопросы

  • Нет связанных вопросов^_^