Страница 1 из 2
билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-20 6:15:15
ProFTP
товарищи!
как сделать билиннг, есть задача: сейчас 15:00:45, 05.05.2220
что бы вывести за текущий день нужно 15:00:45 перевести в секунды и просто отнять назад с отношении с текущими секундами... ну и вы высти трафик и т.д.
тоже самое за неделю, и допустим за год...
а как вывести за месяц? как узнать сколько дней в этом месяце? и получаеться что в октябре бывает 29 и 28 дней, а как тут определить сколько дней?? нужно в структурные данные (пример масив) создать календариь на пару годов в перед календарь?
какой алгоритм сделать, можеть модуль есть?
http://search.cpan.org/search?query=calendar&mode=all
а как наш календарь называеться христианский?
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-20 7:04:30
zingel
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-20 7:11:32
ProFTP
что не получаеться найти...
можно сюда тыкнуть?
у меня есть 05.05.2220 15:00:45 как мне узнать сколько это ушло секунд за прошлый месяц и по запрошлый??
или как узнать сколько дней (секунады надо) в прошлом месяцу в 05.04.2220 ??
или тут элементарно? что-то понять не могу

Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-20 7:15:29
zingel
у меня есть 05.05.2220 15:00:45 как мне узнать сколько это ушло секунд за прошлый месяц и по запрошлый??
Вашими устами только ТЗ и ставить...
я немогу понять, что в итоге должно получится? Цель* ?
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-20 7:19:02
ProFTP
нужно вынести трафик за 04.2220 месяц
то есть: послать запрос в mysql в диапазоне в секундах...
(сори если плохо вопрос сформулирован)
тут надо
Код: Выделить всё
$time{'yyyy/mm/dd hh:mm:ss.mmm'} 2003/06/05 13:02:14.171
и буду секунды до 2003/06/05 года потом отсчитать до 2003/07/05

Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-20 7:40:14
ProFTP
правильнее будет
наверное так:
узнаю сколько секунд в это дате 2220.04.01 00:00:00
узнаю сколько секунд в это дате 2220.05.01 00:00:00
и потом посылаю запрос в базу в секндах в диапазоне с 2220.04.01 00:00:00 до 2220.05.01 00:00:00,
и это будет месяц 2220.04.01
запутался просто, решено

Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-21 15:03:36
zg
ProFTP писал(а):правильнее будет наверное так:
правильней использовать date и timestamp для хранения полей даты и времени
ProFTP писал(а):и потом посылаю запрос в базу в секндах в диапазоне с 2220.04.01 00:00:00 до 2220.05.01 00:00:00, и это будет месяц 2220.04.01

если используешь date для хранения даты, то можно и так
Код: Выделить всё
SELECT udate, SUM(bytes) FROM `traffic` WHERE udate BETWEEN "2008-01-01" AND "2008-01-30" GROUP BY udate
-- и так тоже можно, если база мелкая
SELECT udate, SUM(bytes) FROM `traffic` WHERE udate LIKE "2008-01%" GROUP BY udate
с точностью до секунд хранить трафик в базе смысла нет, пускай оно в логах лежит, в базе нужна только суммарная инфа.
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-21 16:32:55
ProFTP
может быть так:
Код: Выделить всё
]BETWEEN "2008-01-01" AND "2008-02-01" GROUP BY udate
а как я узнаю сколько дней в этом месяце 2008-01-* , чтобы календарь не строить?
получаеться так...
перевести в секунды не проблема, но как правильно делать не знаю, примеров нету, делаю как получиться...
UPD: не увидел сразу, тогда так подойдет:
Код: Выделить всё
SELECT udate, SUM(bytes) FROM `traffic` WHERE udate LIKE "2008-01%" GROUP BY udate
это в гугле это находил не однократно
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-21 16:42:05
hizel
секнд
Код: Выделить всё
mysql> select UNIX_TIMESTAMP('2008-06-01 00:00:00')-UNIX_TIMESTAMP('2008-05-01 00:00:00');
+-----------------------------------------------------------------------------+
| UNIX_TIMESTAMP('2008-06-01 00:00:00')-UNIX_TIMESTAMP('2008-05-01 00:00:00') |
+-----------------------------------------------------------------------------+
| 2678400 |
+-----------------------------------------------------------------------------+
1 row in set (0.00 sec)
часов
Код: Выделить всё
mysql> select (UNIX_TIMESTAMP('2008-06-01 00:00:00')-UNIX_TIMESTAMP('2008-05-01 00:00:00'))/3600;
+------------------------------------------------------------------------------------+
| (UNIX_TIMESTAMP('2008-06-01 00:00:00')-UNIX_TIMESTAMP('2008-05-01 00:00:00'))/3600 |
+------------------------------------------------------------------------------------+
| 744.0000 |
+------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
дней
Код: Выделить всё
mysql> select (UNIX_TIMESTAMP('2008-06-01 00:00:00')-UNIX_TIMESTAMP('2008-05-01 00:00:00'))/3600/24;
+---------------------------------------------------------------------------------------+
| (UNIX_TIMESTAMP('2008-06-01 00:00:00')-UNIX_TIMESTAMP('2008-05-01 00:00:00'))/3600/24 |
+---------------------------------------------------------------------------------------+
| 31.00000000 |
+---------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-21 18:09:04
zg
ProFTP писал(а):а как я узнаю сколько дней в этом месяце 2008-01-* , чтобы календарь не строить?
получаеться так...
эххх молодёж

мануалы то для кого писаны?
Код: Выделить всё
SELECT @fday:=DATE_FORMAT(NOW(), "%Y-%m-01") , DATE_FORMAT( DATE_SUB( DATE_ADD( @fday, INTERVAL 1 MONTH ), INTERVAL 1 DAY ), "%Y-%m-%d" );
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-21 18:12:20
hizel
моё элегантнее

Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-21 18:22:08
zg
hizel писал(а):моё элегантнее

у тебя промежуточное значение, у меня конечное

это разные вещи

Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-21 21:05:12
dikens3
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-21 21:17:42
zg

неслабо разогнали тему
ну можно и так
Код: Выделить всё
SELECT @fday:=DATE_FORMAT(NOW(), '%Y-%m-01') first, @lday:=@fday + INTERVAL 1 MONTH - INTERVAL 1 DAY last
меня, правда, смущает неявное приведение типов, а так вполне компактно получилось

Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-24 13:14:44
ProFTP
кто ставил этот модуль Time::Format в какой пакет он входит, его найти не могу...
Всем спасибо
теперь как вывести все месяца для конкретного пользователя, например от 2005.05.05 до 2008.07.24 (до текущего времени)
что я хочу сделать:
1) вывести все месяца от регистрации пользователя до текущей даты
2) сразу подсчитать за каждый месяц трафик
3) сделать кликабельные ссылки, после клика на месяц чтобы вывелись все дни месяца (как вывести месяца, ну и опрелить дни?)
4) после нажатия на день, чтобы вывелась подробная статистика
я решил хранить в секундах дату (можно срзу конвектировать и в обычную)
не понимаю как вывести все месяца от 2005.05.05 до 2008.07.24 и отпределить сколько в каждой месяце дней
тут нашел вариант:
вывести всю дату из стобиков в память, дальше удулить повторяющиеся строки чтобы остались только месяца (но это займет ОЧЕНЬ МНОГО времени всё выносить) елси бы диапазоны построить... подскжаите как сделать надо?
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-24 13:51:46
hizel
обратите внимание на модуль DateTime, там по моему есть все что только может понадобится для оперирования датой\временем
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-24 13:55:03
ProFTP
Код: Выделить всё
Module Version: 0.01 Source
* NAME
* SYNOPSIS
* DESCRIPTION
* IMPLEMENTATION
* SUBCLASSING
* AUTHOR
NAME ^
Date::Time - Lightweight normalised datetime data type
SYNOPSIS ^
This is just some suggestions, as nothing is implemented yet. I'm open to critisism. Anyway I don't know if the original name will fit this module with all my plans....
use Date::Time;
my $date=Date::Time->new();
# Set date
$date->set; # Set to current time
$date->set(time-60); # Set to 'one minute ago'
my $greg=Date::Time::Gregorian->new();
$greg->parse(source=>'Fri Mar 3 01:20:54 CET 2000');
$greg->parse(source=>'one month ago', format=>'unknown');
$greg->set(localtime, {timezone=>'local'});
$greg->set(gmtime);
my $db_time=new Date::Time::MySQLTimeStamp;
$db_time->set(200003031859);
# Output date and date elements
print $db_time->Gregorian->as_string;
print $db_time->Gregorian->year;
print $db_time->Gregorian->strftime('%A');
# The month operator here will return a Date::Gregorian::Month object.
print $db_time->Gregorian->month->as_string(LANG=>'en');
print $db_time->Julian->as_string;
print $db_time->Maya->as_string;
my $rel_time=$greg->diff($date);
# Will print something like "3 hours ago" or "5 weeks ago"
print $rel_time->Gregorian->as_string;
DESCRIPTION ^
See the README as for now. By the way, I want to be neutral to the calender system - that's why the SYNOPSIS above looks like it does. Personally I think Gregorian dates sucks a lot - but I'm living in a Gregorian world and I'm myself mostly thinking about time in Gregorian terms anyway.
The same applies to the decimal number system, btw. I mean, of all numbers, why on earth did they chose 2*5? It's really a stupid, ugly number :) Anyway, I'm always thinking in decimal terms, it's very hard for me to do calculations in other systems.
IMPLEMENTATION ^
I'm intending to write a bit about how I've thought implementing this one here. Some thoughts are already in the README.
SUBCLASSING ^
I will write a bit on how to do subclassing and how to contribute new methods here.
AUTHOR ^
Tobias Brox <tobix@irctos.org>
All kinds of feedback is welcome - and is probably a prerequisite for progress on this module.
это все что в нем есть...
а какой у нас календарь григорианский?
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-24 14:00:50
hizel
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-24 14:26:09
ProFTP
Я не вижу чтобы там можно было сделать, это сделать:
у меня есть 2 даты
500000000
400000000
как мне сделать, то что я описал?
или тут все таки как-то по другому надо ?
вот так чтоли:
вывести всю дату из стобиков в память, дальше удулить повторяющиеся строки чтобы остались только месяца (но это займет ОЧЕНЬ МНОГО времени всё выносить) елси бы диапазоны построить... подскжаите как сделать надо?
или тут надо с помощью СУБД oracl?
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-24 15:02:53
hizel
в модуле DateTime кроме объекта DateTime в котором хранится собственно дата-время, есть объект DateTime::Duration в котором хранится разница двух дат
эту разницу в потом можете прибавлять\удалять к другим датам, а также брать иё в различных единицах измерения
Код: Выделить всё
#!/usr/bin/perl
#
use DateTime;
my $dt1 = DateTime->new( year => 2003, month => 4, day => 5,hour => 2,time_zone => 'local');
my $dt2 = DateTime->new( year => 2008, month => 5, day => 5,hour => 2,time_zone => 'local');
my $delta = $dt2 - $dt1;
print $delta->delta_months;
извольте вкурить
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-24 15:57:09
ProFTP
вы наверное имеете ввиду подсчитать количесво месяцев а потом у цикле прибавлять таким образом
Код: Выделить всё
my $dt = DateTime->new( year => 2003, month => 4, day => 5,
hour => 1, minute => 58,
time_zone => "America/Chicago",
);
$dt->add( days => 1, minutes => 3 );
# 2003-04-06 02:01:00
$dt->add( minutes => 3 )->( days => 1 );
# 2003-04-06 03:01:00
буду пробовать - это должно сработать...
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-25 9:41:19
zg
ProFTP писал(а):что я хочу сделать:
1) вывести все месяца от регистрации пользователя до текущей даты
2) сразу подсчитать за каждый месяц трафик
3) сделать кликабельные ссылки, после клика на месяц чтобы вывелись все дни месяца (как вывести месяца, ну и опрелить дни?)
4) после нажатия на день, чтобы вывелась подробная статистика
это всё делается через адын запрос и два ассоциативных массива

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

поскольку решается это всё через две таблицы и один файл-лог.
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-25 9:49:41
ProFTP
я тут не могу найти про дату
http://www.mysql.ru/docs/man/ есл ивы это имеете ввиду
если по вашему варианту,
zg , то что первое надо делать? если дата стоит пусть в формате обычном "2005.05.05", то как вывести дату чтобы она не повторялась? если всю дату буду выносить то mysql повиснит... каким образом построить хэш? если не сложно, скажите
Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-25 11:14:57
hizel
если вы завязываетесь на мускул то ради бога

Re: билинг, месяца, годы и т.д. perl
Добавлено: 2008-07-25 21:47:21
ProFTP
hizel писал(а):если вы завязываетесь на мускул то ради бога

ваш вариант больше нравиться
все равно лижбы работало, только я регулярку не понял в СУБД, чтобы вывести первые даты, и чтобы они не повторялись...
тесты скорости скоро покажу