| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Базы Данных > сортировка по времени |
| Автор: sugee 17.2.2006, 20:01 |
| В одно из полей таблицы записываются даты в формате UTC, то есть в таком виде [02/Feb/2006:11:29:49 +0300]. Точнее говоря само поле у меня сейчас имеет тип text, я с этим ещё не определился. При выводе нужно будет сортировать записи по времени. Может лучше записывать время в базу данных в формате datetime, тогда не будет проблем с сортировкой, но как перевести его в этот формат? |
| Автор: Нурик Сакура 17.2.2006, 20:19 | ||||
| Как я у себя делал: в таблице есть поле Created формата DATETIME заносится время вот так:
выводится:
|
| Автор: sugee 17.2.2006, 20:55 |
| Nurik, я перечитал свой пост, там действительно не совсем ясно о чём речь идёт. Мне не текущее время нужно, я читаю записи из файла(лог Apache) и заношу их базу данных. Потом надо будет выводить записи отсортированные по времени. В чем собственно и вопрос: как сортировать записи по времени записанному в таком формате [02/Feb/2006:11:29:49 +0300]. |
| Автор: Нурик Сакура 17.2.2006, 20:57 | ||
Попробуй так:
|
| Автор: sugee 17.2.2006, 21:20 |
| Nurik, если бы всё было так просто я бы не спрашивал. Посмотри на формат записи, что такое с точки зрения SQL(или PHP) Feb или Jan? Просто набор символов... Нужно привести дату в человеческий формат, который можно сортировать, например datetime. |
| Автор: Нурик Сакура 17.2.2006, 21:55 |
| Хех, даже не знаю. Только что пересмотрел учебник по ПХП (прошу не смеятся, я токо учусь), там есть такой вариант, как strtotime, но такой формат, как у тебя он не поддерживает, увы... |
| Автор: sugee 17.2.2006, 22:14 |
| Нет в принципе функцию перевода в datetime можно написать самому, но неужели других способов нет? Ведь эту функцию придется применять к каждой строке файла, а их у меня 25 тысяч, я ещё в скрипте регулярку ипользую, это сколько ж придется ждать пока этот скрипт что-то выдаст? |
| Автор: Нурик Сакура 17.2.2006, 22:22 | ||
| Скрипт будет явно пахать долго. А насчет уже готовых скриптов обработки логов Апача - то я сомневаюсь, что кто-то это делал. Ты в Инете не пытался найти? Добавлено @ 22:28 Я, конечно, понимаю, что готовое решение куда хуже, чем собственное. Но если ты нормально разбираешься - то ты сможешь найти то, что тебе нужно. Надеюсь, что оно подойдет. Apache logfile monitor Сайт автора: http://www.maryan.com.ua/?language=rus Описание: http://www.maryan.com.ua/?action=log Демо: http://www.maryan.com.ua/logs/log.php Качать: http://www.maryan.com.ua/maryanlog.zip Бесплатный PHP+MySQL
Добавлено @ 22:36 Или вот, но я не уверен, на ПХП ли оно: http://www.mrunix.net/webalizer/ |
| Автор: sugee 18.2.2006, 11:21 | ||
Только что провёл эксперимент:
Результат такой: 1970-01-01 03:00:25 |
| Автор: Нурик Сакура 18.2.2006, 11:26 |
| Короче, как я понял, тебе нужно преобразовать дату, получаемую из логов, и уже потом с ней работать. |
| Автор: sugee 18.2.2006, 11:46 | ||
|
| Автор: -=Ustas=- 18.2.2006, 13:15 |
| sugee, ну зачем же сразу так отчаиваться?! Во-первых, хранить дату надо в Unix timestamp, т.к. с ней можно вытворять, что только душе угодно. Во-вторых, у тебя в этой строке (02/Feb/2006:11:29:49 +0300) есть абсолютно всё, что нужно. Бери, разбирай эту строчку, приводи её к timestamp, и записывай в БД. В чем собсна проблема? |
| Автор: IZ@TOP 18.2.2006, 17:38 | ||
Верно. А перевести дату в timestamp, думаю получится при помощи этой функции http://ru2.php.net/strtotime sugee, и не забудь на дату поставить индекс. |
| Автор: sugee 18.2.2006, 18:29 | ||
В базу записывается вот что: 0000-00-00 00:00:00 Да я как раз подумал было что моя проблема решена, точнее говоря что её и не было. Думал я так до тех пор пока не встал вопрос о сортировке по дням. |
| Автор: sugee 18.2.2006, 20:07 | ||
| Вместо strtotime попробовал mktime. Вроде получился самый что ни на есть timestamp, а в базе всё равно нули Что я не так делаю?
|
| Автор: sugee 18.2.2006, 21:10 | ||
| А, ну <br>-ы я убрал, всё равно в таблице нули. А сам timestamp выводится.
|
| Автор: sugee 18.2.2006, 21:46 | ||
А поле datetime, теперь все правильно. Почему только Y-m-d - просто из-за парсинга строки скрипт дико тормозит! |
| Автор: sugee 18.2.2006, 22:12 |
| Рано радовался, у меня во всех строках теперь одинаковая дата стоит. И если поле timestamp - то же самое. Научите как правильно писать в поле типа timestamp |
| Автор: sugee 19.2.2006, 01:43 | ||
Вот так правильно отображается только число, год почему-то всегда меньше на единицу, вместо 2005-го 2004-й и т.д. Месяц везде декабрь, хотя есть ещё январь и февраль. |
| Автор: -=Ustas=- 19.2.2006, 08:47 |
| Тип поля в бд под timestamp лучше делать целочисленный. Слушай, если ты беспокоишься о том, что скрипт слишком долго выполняется, то есть еще одно решение, более простое. Насколько я знаю, Апач пишет всегда в конец файла, вот это тебе и будет уже самая что нинаесть сортировка по дате. Выхватываешь всё по-строчно из этого файла и пишешь в БД, для сортировки делаешь ORDER BY id DESC, и все твои проблемы... |
| Автор: sugee 19.2.2006, 09:51 |
| Да, это уже предлагали http://forum.vingrad.ru/index.php?showtopic=84309&view=findpost&p=648474 Если нужна просто сортировка по времени, то этого достаточно, но мне ещё нужно будет выводить статистику за последние десять дней. Сколько за день было хостов, хитов и тому подобное. |
| Автор: sugee 19.2.2006, 10:30 | ||||
Я поменял тип поля на INT(32) и пишу туда дату непосредственно в формате timestamp
Вывожу так
|
| Автор: -=Ustas=- 19.2.2006, 14:08 | ||
Вот тебе набросал как примерчик, для получения timestamp в твоем случае:
Хотя...может можно как-то и оптимизировать, просто всё на скорую руку... |
| Автор: IZ@TOP 19.2.2006, 15:57 | ||
Думаю это будет побыстрее прегов. Пишем $stmp в базу в поле типа int(10). Ставим на него индексы (в связке с другими полями, если те учавствуют в отборе). |
| Автор: sugee 19.2.2006, 19:25 | ||
| -=Ustas=-, я применил в своей фунции твой вариант в сочетании с вариантом IZ@TOP. Вроде не перепутал ничего... Время получается 01.01.1970 // 03:00:01 Начало эпохи Unix если не ошибаюсь
Добавлено @ 19:27 Поле int(10) |
| Автор: -=Ustas=- 20.2.2006, 10:05 | ||
sugee, в варианте Изотопа маленькое упущение, которое ты должен был заметить, прочитав про формат входных данных функции strtotime() ;) Попробуй так:
|
| Автор: sugee 20.2.2006, 17:54 |
| Нет, то же самое получается. |
| Автор: -=Ustas=- 20.2.2006, 18:20 |
| хм... действительно. Ну попробуй тогда полностью мою функцию применить, хоть и немного дольше обрабатывает, на зато наверняка |
| Автор: sugee 20.2.2006, 20:00 | ||
| А вот теперь происходит очень интересная вещь. date() перед записью в базу даёт правильный результат, а вот из базы выводится все то же 01/01/70 03:00:00.
|
| Автор: -=Ustas=- 20.2.2006, 23:05 | ||
sugee, здрасте, а кто будет переменной $time значение присваивать?!
|
| Автор: sugee 21.2.2006, 08:50 |
| Да, можно было бы ещё долго разбираться в тонкостях форматов времени! Теперь всё на месте, только пожалуй функцию MakeTime() я опять приведу к изотоповскому виду. |
| Автор: IZ@TOP 22.2.2006, 20:48 |
| -=Ustas=-, эй, товарищи, оно работает. Пробел съелся! Я уже везде проверил - везде работает. |
| Автор: -=Ustas=- 22.2.2006, 21:02 | ||
Не может такого быть! (Хотя...может только сегодня... Я только что попробовал, без пробела - вообще дату не хавает, возвращает -1, с пробелом совсем не те года подставляет. Добавлено @ 21:07 Появилась еще одна особенность, если допустим в такой дате 22/Feb/2006:20:56:11 количество секунд превышает число 37, то всё, дата не переводится в timestamp. И еще, IZ@TOP, я незнаю как ОНО могло у тебя сработать, у меня такую дату - 22/Feb/2006:20:56:36 перевело как 22 февраля 2036 года |