Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Что оптимальнее (обработка дат).


Автор: Kesh 6.2.2005, 21:16
Есть табличка, в которой есть два поля `datestart` и `dateend` типа timestamp(14). В которых хранятся даты начала и конца определенного события. После этого выполняется запрос на события, которые должны произойти в течение недели. Делается это так
SQL
SELECT s.`id`, CONCAT(DATE_FORMAT(s.`datestart`,'%H:%i'),' − ',DATE_FORMAT(s.`dateend`,'%H:%i')) as `interval`, s.`subject`, s.`place`, s.`author`, s.`datestart`, s.`dateend`, DATE_FORMAT(s.`datestart`,'%d.%m.%Y') as `shedule_date`, TO_DAYS(s.`datestart`)-TO_DAYS(current_timestamp) as `datediff`, NOW() as `currtime`
FROM shedule s
WHERE ((TO_DAYS(s.`datestart`)-TO_DAYS(current_timestamp)) < 7) AND ((TO_DAYS(current_timestamp)-TO_DAYS(s.`dateend`)) <= 0)
ORDER BY s.`datestart` ASC

Обратите внимание на это выражение
SQL
CONCAT(DATE_FORMAT(s.`datestart`,'%H:%i'),'&nbsp;&minus;&nbsp;',DATE_FORMAT(s.`dateend`,'%H:%i')) as `interval`

оно преобразует дату из двух полей в выражение типа 11:40 - 12:20
Вопрос вот в чем, не оптимальнее ли будет это делать (преобразование дат) через PHP и как это сделать.

Автор: Mal Hack 6.2.2005, 22:03
Kesh
А почему нельзя хранить дату ввиде: 1107716599, работать элементарно и не надо диких запросов?

Автор: Kesh 6.2.2005, 22:52
Mal Hack а в timestamp она так и хранится только наоборот YYYYMMDDHHmmSS
Добавлено @ 22:54
http://www.mysql.ru/docs/man/DATETIME.html

Автор: Mal Hack 6.2.2005, 23:12
Нет, ты не понял...
Я тебе говорю не про YYYYMMDDHHmmSS, а про UNIX TIME, где 1107716599 - число секунд с начала 1970 года...

Автор: Kesh 7.2.2005, 00:42
Mal Hack
Цитата(Mal @ 6.2.2005, 22:03)
А почему нельзя хранить дату ввиде: 1107716599, работать элементарно и не надо диких запросов?

Ладно, понятно, извини недоглядел...
Ну и чем лучше выбирать UNIX_TIME и потом отрабатывать его в PHP, чем получать готовые данные из запроса?..

Автор: Mal Hack 7.2.2005, 00:54
1. UNIX_TIME - число, а следовательно ве операции сравнения в базе будут намного быстрее, чем использования FROM_UNIXTIME и т.п.
2. Выбрать за период очень просто, опять `time` < `time` - 7 * 60* 60 к примеру.
3. запросы короче и более читаемы.
4. Когда ты уже вынешть нужную инфу тебе очень легко сделать нормальный вывод, применив к ячейке date(); к примеру...
Т.е. ты не завязан на конкретном формате даты, который ты делаешь в запросе..

Но самое главное - 1 и 2.

Автор: Kesh 7.2.2005, 01:19
Mal Hack
Цитата(Mal @ 7.2.2005, 00:54)
чем использования FROM_UNIXTIME

Я не использую FROM_UNIXTIME.

Цитата(Mal @ 7.2.2005, 00:54)
`time` < `time` - 7 * 60* 60

7*60*60 тоже вычисляется... И даже если записать константой, то уж от операции вычитания никуда недеться...

Цитата(Mal @ 7.2.2005, 00:54)
запросы короче и более читаемы.

Запрос зашит в php код и я не думаю, что преобразования внутри php будут удобнее, чем в запросе с точки зрения читаемости самих исходников скриптов.


Цитата(Mal @ 7.2.2005, 00:54)
Когда ты уже вынешть нужную инфу тебе очень легко сделать нормальный вывод, применив к ячейке date(); к примеру...

Так а сейчас мне этого вообще делать не надо - я просто вывожу уже имеющиеся данные...

Автор: Kesh 7.2.2005, 01:30
Цитата
Storage Requirements: DATETIME 8 bytes
собсно, DATETIME это тип BIGINT ;)
и хранит в себе точноe значение даты/времени,
а не число секунд, как TIMESTAMP...

Автор: Mal Hack 7.2.2005, 12:05
Цитата(Kesh @ 7.2.2005, 01:19)
Я не использую FROM_UNIXTIME.

Я имел ввиду не конкретно эжту функцию, а вообше...
CONCAT и DATE_FORMAT в твоем запросе.

Автор: Kesh 7.2.2005, 14:41
Mal Hack А ты думаешь, что такая обработка в php будет гораздо быстрее?..

Автор: Song 7.2.2005, 14:54
Kesh
конечно.
+ ещё unix time использовать. Даже не сравнимо.
Ты сделай EXPLAIN запроса, посмотри, утверждать не берусь, но по-моему при использовании таких функций мускул не использует индекс.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)