Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выборка из бд по дате

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
lawer85
Отправлено: 06 Января, 2016 - 16:29:17
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




Есть таблица с полем timestamp. Туда записывается дата + время типа так 2016-01-03 20:16:29

Как мне вытащить все записи одной даты конкретной даты?

Запрос такого вида не проходит

CODE (SQL):
скопировать код в буфер обмена
  1. "SELECT id FROM activities WHERE created_at='2016-01-03'"
 
 Top
re_nat
Отправлено: 06 Января, 2016 - 16:41:31
Post Id



Частый гость


Покинул форум
Сообщений всего: 198
Дата рег-ции: Март 2012  


Помог: 5 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id FROM activities WHERE DATE_FORMAT(created_at, '%Y-%m-%d')='2016-01-03'
 
 Top
lawer85
Отправлено: 06 Января, 2016 - 17:02:43
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




Спасибо
 
 Top
Мелкий Супермодератор
Отправлено: 06 Января, 2016 - 17:03:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id FROM activities WHERE created_at='2016-01-03'

После приведения типов становится
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id FROM activities WHERE created_at='2016-01-03 00:00:00'

Понятно, почему не работает как ожидается?

Вариант
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id FROM activities WHERE DATE(created_at)='2016-01-03'

Или DATE_FORMAT, как предлагает re_nat дадут нужный результат. Вот только вопрос цены.
Эти запросы в принципе не смогут использовать индекс по created_at.
И если для нормальных СУБД можно сделать индекс по функции, то в mysql - никак.

Лучше немного усложнить клиентскую часть и генерировать запрос
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id FROM activities WHERE created_at >= '2016-01-03' AND created_at < '2016-01-04'

Надо глянуть explain'ы, но по идее оптимизатор не должен тупить и с простым
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id FROM activities WHERE created_at >= '2016-01-03' AND created_at < '2016-01-03' + interval 1 day


-----
PostgreSQL DBA
 
 Top
lawer85
Отправлено: 06 Января, 2016 - 17:13:23
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




Я понимаю почему мой вариант не работал. Я предполагал, что надо указать что это только часть от полной даты что записано в поле created_at.

Однако не понял почему MySQL может не так понять мой запрос. Ведь я явно указываю что дата такая-то.
 
 Top
Мелкий Супермодератор
Отправлено: 06 Января, 2016 - 17:26:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ну а mysql считает, что если вы хотите сравнить timestamp со строкой, значит последнюю надо приводить к timestamp.


-----
PostgreSQL DBA
 
 Top
lawer85
Отправлено: 06 Января, 2016 - 17:30:01
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




Я имел ввиду если писать так

SELECT id FROM activities WHERE DATE_FORMAT(created_at, '%Y-%m-%d')='2016-01-03'
 
 Top
Мелкий Супермодератор
Отправлено: 06 Января, 2016 - 17:38:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А так работать будет. Только медленно.


-----
PostgreSQL DBA
 
 Top
lawer85
Отправлено: 06 Января, 2016 - 17:40:16
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




Я тему индексов плохо знаю. Вообще в чем прикол этих индексов. MySQL делает запрос и выборку, делает соответствующие записи в отдельную таблицу так и затем уже перебирает по ней, а не по всей бд я правильно понимаю?
(Добавление)
Да и для чего указывать interval 1 day ?

(Отредактировано автором: 06 Января, 2016 - 17:41:22)

 
 Top
re_nat
Отправлено: 06 Января, 2016 - 17:52:14
Post Id



Частый гость


Покинул форум
Сообщений всего: 198
Дата рег-ции: Март 2012  


Помог: 5 раз(а)




lawer85, индексы нужны для ускорения поиска. Mysql формируем специальные деревья (читай графы) на основании заданных индексов и при поиске перебирает не все записи таблицы по порядку, а двигается по узлам дерева отталкиваясь от искомых значений.
Не заморачивайте пока себе голову оптимизацией. Всему своё время.

(Отредактировано автором: 06 Января, 2016 - 17:53:37)

 
 Top
lawer85
Отправлено: 06 Января, 2016 - 18:00:33
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




Спасибо. Просто раз уж разговор зашел, то надо разобраться. Мне хочется не просто знать что-то, а еще и разбираться в этом хорошо.
 
 Top
Мелкий Супермодератор
Отправлено: 06 Января, 2016 - 18:43:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Просто сгенерируйте и запишите в табличку немножко данных. Записей этак тысяч сто.
Сразу станет понятно, зачем нужны индексы.

lawer85 пишет:
Да и для чего указывать interval 1 day ?

Чтобы дату конца периода посчитала СУБД. Так может быть удобнее, чем генерировать правильную дату на приложении.


-----
PostgreSQL DBA
 
 Top
lawer85
Отправлено: 06 Января, 2016 - 18:58:18
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




created_at >= '2016-01-03' AND created_at < '2016-01-03' это условие разве не показывает MySQL что нас не интересует то, что идет не 3 января ? Уж простите, может глупые вопросы задаю.
 
 Top
Мелкий Супермодератор
Отправлено: 06 Января, 2016 - 19:23:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Это условие будет ложно уже на этапе разбора запроса. Такое значение невозможно.

Или created_at >= '2016-01-03' AND created_at < '2016-01-04' и считаем дату на приложении
Или created_at >= '2016-01-03' AND created_at < '2016-01-03' + interval 1 day и дату считает SQL, потому что '2016-01-03' + interval 1 day как раз и будет '2016-01-04'


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB