2014-01-17 5 views
0

Я играл с Idiorm, и я не мог заставить его получить все записи из базы данных на сегодня и вчера. Таким образом, запросы MySQL являются:Idiorm запрос для получения сегодняшних записей

SELECT * FROM `video` WHERE DATE(`time_stamp`) = CURDATE() # today 
SELECT * FROM `video` WHERE DATE(`time_stamp`) = CURDATE() -1 # yesterday 

Если я правильно понимаю, это не может быть точно воспроизведен Idiorm, верно? Я также попробовал следующий вариант, который как ни странно, не работает (возвращает пустой массив):

$today = ORM::for_table('video')-> 
     where_lt('time_stamp', 'CURDATE()')-> 
     where_gte('time_stamp', 'CURDATE()-1')->find_many(); 

Можете ли вы пожалуйста, поправьте меня о том, как это должно быть сделано?

+0

и использовать where_raw, например. -> where_raw ('added_date> NOW() - INTERVAL 24 HOUR') – wesamly

ответ

0

Лучше всего для производительности MySQL избегать вещей, которые используют функции для значений столбцов. Например,

WHERE DATE(time_stamp) = CURDATE() /* slow! */ 

полностью поражает использование индекса для поиска записей по времени_stamp. Он вызывает сканирование полного стола, которое работает правильно, но медленно. Вы хотите это выражение SQL, которое будет генерировать сканирование диапазона индекса. Это делается для всех значений time_stamp с полуночи сегодняшней даты.

WHERE time_stamp >= CURDATE() 

Если вы хотите, чтобы найти все значения time_stamp от вчерашнего дня, вам нужно это SQL заявление

WHERE time_stamp >= CURDATE() - INTERVAL 1 DAY 
    AND time_stamp < CURDATE() 

То есть, вы хотите, чтобы все штампы времени в диапазоне [вчера в полночь, сегодня в полночь) , который не включает сегодня полночь.

Я думаю, что ваш код Idiorm имеет неправильное выражение CURDATE() - INTERVAL 1 DAY. CURDATE() - 1 работает в Oracle, но не в MySQL.

+0

Привет, Олли! Спасибо, это действительно полезный совет для начинающего db, подобного мне! Но, к сожалению, я не смог решить свою проблему. Запрос в порядке, я считаю, что проблема находится где-то в Idiorm. Вот что я сделал: $ events = ORM :: for_table ('video') -> where_lt ('time_stamp', 'CURDATE()') -> where_gte ('time_stamp', 'CURDATE() - INTERVAL 1 DAY') -> find_many(); – heuels

+0

Я не знаю много о идиоре. Но, возможно, вам стоит попробовать ... '-> where_raw ('time_stamp> = CURDATE() + INTERVAL 1 DAY') -> where_raw ('time_stamp

+0

Большое вам спасибо, это решило мою проблему! – heuels

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