STR_TO_DATE() против CONSTANT при сравнении поля DATETIME
Есть стол с DATETIME
поле с именем 'made_at'. Я пытаюсь выполнить два запроса, как это:
SELECT * FROM myTable WHERE created_at BETWEEN '2015-03-15 10:25:00' AND '2015-03-25 10:30:00';
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'
Если вы думаете, что получите две даты, вы не правы. Вы получаете все даты в первый день плюс полночь во второй.