Forum Webscript.Ru
Программирование => Perl => Тема начата: Harvester от 22 Апреля 2003, 16:45:26
-
Есть база данных (новости). Как лучше организовать архив новостей с сортировкой по дате? Т.е. как записать туда текущую дату понятно (например, use Time::localtime и т.д. можно и по-другому), а вот как потом сделать вывод с 1 по 15 апреля?
-
perldoc -f time
perldoc -f localtime
perldoc -f gmtime
+ search this forum
-
Должно работать, сам не проверял... выберет из базы все записи за последние 15 дней....
my @date=localtime(time);
$date[5]+=1900;
$date[4]++;
my $endDate="$date[5]-$date[4]-$date[3]";
@date=localtime(time-1296000);
$date[5]+=1900;
$date[4]++;
my $startDate="$date[5]-$date[4]-$date[3]";
$sth=$dbh->prepare("SELECT * FROM table WHERE dates BETWEEN \'$startDate\' AND \'$endDate\' ORDER BY dates");
$sth->execute;
-
Я остановился на
use Time::localtime;
$tm=localtime;
$day=$tm->mday;
$month=$tm->mon+1;
$year=$tm->year+1900;
-
C++, Harvester
Зачем в таблицу заносить именно localtime??
Не проще ли в поле типа INT8 заносить непосредственно time? мне кажется, что от этого система и ускорится (так как сортировать и проводить прочие действия с целым явно быстрее, чем с датой) и вообще все будет как-то красивее смотреться...
-
Собственно дату и запихиваем. Если занести дату по колонкам, то искать проще(select may и 2003). Минимум вычислений потом с большим объемом архива.
-
Harvester вот тут ты ошибаешся.
Быстрее для MySQL будет найти между 634524358 и 634524399 чем между 23 april 2002 и 1 may 2003. А перевести 634524358 в читабельный вид дело одной строчки.
Это в качестве совета.
-
А если найти только все за апрель или май. Т.е. найти, где 3 или 4 в строках (год потом тоже можно одной цифрой обозначать)? По сравнению с нахождением 9-значного числа. Где больше затрат?
-
Они у тебя будут в разных столбцах хранится?
Почитай-ка http://www.mysql.com/doc/ru/Date_calculations.html и разделы по оптимизации.
-
Пока не решил. Скорее всего в одном. День мне уже не нужен. Можно обойтись записью 43 (ну 403) = апрель 2003. Найти данные за апрель 2003 = найти в столбце 43 (403). Зачем искать 634524399 ?
-
Дату новости ты будешь как выводить? Апрель 2003г? Или лучше 20 Апреля 2003г 20:15
Дело конечно твое, но "лучше один день потерять зато потом за час долететь" (С) из мультфильма.
-
Люди 1к извенений :)
Мы же говорим о mySQL ???
Harvester чем тебе не нравятся поля типа DATE
Я еще бы понял если было бы только DATETIME
Или если планировался бы такой поток при катором экономия 1 байта позволяла б сэкономить сервак :)
DATE размер 3б
формат YYYY-MM-DD
INSERT INTO .... data_add=NOW().... (data_add=текущему числу например: 2003-04-24)
вывести все новости за текущий месяц
SELECT ... FROM ... data_add>\'2003-04-01\' AND data_addли так
SELECT ... FROM ... data_add>\'2003-04-01\' AND data_add<\'2003-04-24\'
-
Об этом я не подумал...
Дату можно тоже сохранять и выводить потом даже с часами, минутами и секундами, но поиск для скорости будет по месяцам и году. Я думаю. что никому в голову не придет искать новость по часам и минутам. К тому же, новости будут добавляться не каждый день.
-
Я нигде не нашел(наверное ни там или не правильно искал :) )
как хранятся переменные дат в базе
но явно ни как строки :)
TIMESTAMP занимает 4байта формат yyyy-mm-dd hh:dd:ss
хотя....
Опять же ни нашел ( возможно что то с монитором или глазами а то и головой :) ) в руководстве по оптимизации указаний не использовать переменные дат
Harvester вы вводите лишнее поле не ниже 2байт (ydd)
вы считаете что выигреш уменьшения размера значений сравнения превысит проигреш из-за увеличения базы ?
-
Ау!
Речь идет не о размере базы данных, а об удобстве манипулирования и экономии на вычислениях.
Если все это ничтожно мало, то лучше взять yyyy-mm-dd.
-
Harvester
Не морочь себе голову. Делай TIMESTAMP. Или DATETIME.
-
Обратите внимание на ссылку данную мной на первой странице этой темы.
На сайте http://www.mysql.com находится подробная документация.
[Тема закрыта.]