Нужно из mysql выбрать данные примерно по такому условию от 2017-08-01 по 2017-08-31 выбрать столбца created а начиная с 2017-09-01 выбырать из столбца change_date?
DATE(created) BETWEEN '2017-08-01' AND '2017-08-31'
это прям bad bad code.
mysql будет вычислять DATE для каждого кортежа + не будет использоваться индекс.
если нужно выбирать по datetime - лучше всего явно прописывать в запросе
created BETWEEN '2017-08-01 00:00:00' AND '2017-08-31 23:59:59'
Дмитрий Энтелис, я же написал, что для типов дата и дата-время пойдет то, что я написал выше. Пример с DATE(created) был для типов timestamp. Чем это bad bad code?
Хомон, так сложно сказать. Навскидку предполагаю, что нет записей, которые бы были созданы только в августе, в то время как изменялись только в сентябре. У меня не хватает данных для точного ответа. Если можно скришот, какие именно данные вы хотели бы получить.
Я вот провел тесты, всё работает корректно.
Хомон, Приведите пример какой-нибудь записи, которая бы у вас имела дату создания в августе, а дату изменения в сентябре. Можно сообщить какие у них значения в полях created и change_date?
Алексей, change_date я добавил только сегодня и default value change_date для записей которые созданы раньше = '0000-00-00 00:00';
Может причина в этом?
Хомон, ну те, у которых значение change_date = '0000-00-00 00:00'; точно не попадут в выборку, так как они изменялись не позже чем 2017-09-01. А вот если сегодня были какие-то записи изменены и это поле стало отличаться от '0000-00-00 00:00', тогда они должны попасть в выборку, при условии что созданы были в августе.
Алексей, я же написал: когда Вы пишите DATE(field) - значение функции DATE будет вычисляться для каждой строки таблицы, а только после этого фильтроваться using temporary. Это адски медленно.
Дмитрий Энтелис, Это уже вообще другой подход. Как вы будете формировать значения 1501538400 и 1504216799? скриптом? на каком языке? Топикастер задал вопрос только про MySQL, и какой у него язык программирования не ясно, потому формирование значений в этом формате выходит за рамки заданного вопроса.
Когда я вижу вопрос про SQL без указания языка программирования, я стараюсь ответить так, чтобы он работал даже в phpMyAdmin.
Просто я сам иногда формирую запросы в phpMyAdmin и иногда непосредственно в консоли, чтобы посмотреть какие-то данные из базы данных. Это разовая операция, потому не требует ни скриптов ни интерфейса для просмотра данных.
Алексей, это уже софистика пошла. Абсолютно не важной какой у ТС язык программирования - на любом, даже на баше можно сконвертировать 2017-08-01 в 1501538400.
Дмитрий Энтелис, Причем тут софистика. Я задал вам конкретный вопрос по MySQL, как мне сделать запрос в консоли, чтобы посмотреть выборку. Поля у меня хранятся формате timestamp. Предложите написать специальный скрипт?
... WHERE
(created BETWEEN UNIX_TIMESTAMP('2017-08-01 00:00:00') AND UNIX_TIMESTAMP('2017-08-31 23:59:59'))
AND
change_date >= UNIX_TIMESTAMP('2017-09-01 00:00:00')
Дмитрий Энтелис, это неверный запрос, UNIX_TIMESTAMP не поможет в таком формате запроса. Тогда вам нужно делать и UNIX_TIMESTAMP(created) и UNIX_TIMESTAMP(change_date) тоже, чтобы получилось получить данные.
Вот так будет работать
WHERE
(UNIX_TIMESTAMP(created) BETWEEN UNIX_TIMESTAMP('2017-08-01 00:00:00') AND UNIX_TIMESTAMP('2017-08-31 23:59:59'))
AND
UNIX_TIMESTAMP(change_date) >= UNIX_TIMESTAMP('2017-09-01 00:00:00')