STR_TO_DATE() против CONSTANT при сравнении поля DATETIME

Есть стол с DATETIME поле с именем 'made_at'. Я пытаюсь выполнить два запроса, как это:

  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, К сожалению, в нем нет объяснения, почему такой подход является наилучшим.

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

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

Спасибо!

1 ответ

Решение

Я предпочитаю вводить константы напрямую. Я считаю, что 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 дней и пять минут. В любом случае, использование between с датами и датами может привести к неожиданным результатам, особенно когда вы делаете:

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

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

Другие вопросы по тегам