Сложение "времени"

jone31

Новичок
Сложение "времени"

в таблице `online` есть столбец `time` в нем находится время захода и время выхода пользователя в формате timestamp

вот вид таблицы
time | id | type
2009-10-30 19:11:36 | 786 | STATE_IN
2009-10-30 19:11:57 | 786 | STATE_OUT
таких записей в БД тысячи.

как сложить время?
(мне нужно узнать сколько времени пользователь был онлайн.)
 

Dovg

Продвинутый новичок
http://www.postgresql.org/docs/8.4/static/functions-datetime.html
субд не указана. ;)
 

baev

‹°°¬•
Команда форума
Mr_Max, Dovg, тут не datetime-функции нужны, а тотальная перестройка базы.
 

jone31

Новичок
Автор оригинала: StiM
http://phpclub.ru/detail/article/date_stuff

Тебе нужно не складывать, а вычитать.

mktime(время_выхода) - mktime(время_входа)

Описание mktime() тут: http://www.phpclub.net/manrus/f/mktime.html
у меня эта функция возвращает непонятно што!?
PHP:
// ВХОД
$time1 = '2009-11-09 13:03:25';
// ВЫХОД
$time2 = '2009-11-09 18:15:30';

$t1 = explode(" ", $time1);
$t2 = explode(" ", $time2);
$d1 = explode("-", $t1['0']);
$d2 = explode("-", $t2['0']);
$ti1 = explode(":", $t1['1']);
$ti2 = explode(":", $t2['1']);

echo "<b>ВХОД</b>&nbsp; ".$ti1[0]. ':'. $ti1[1].':'.$ti1[2].' '.$d1[1].'-'.$d1[2].'-'.$d1[0] . "<br>";
echo "<b>ВЫХОД</b>&nbsp; ".$ti2[0]. ':'. $ti2[1].':'.$ti2[2].' '.$d2[1].'-'.$d2[2].'-'.$d2[0] . "<br>";
echo mktime($ti2[0],$ti2[1],$ti2[2],$d2[2],$d2[1],$d2[0]) - mktime($ti1[0],$ti1[1],$ti1[2],$d1[2],$d1[1],$d1[0]);
результат работы:
ВХОД 13:03:25 09-11-2009
ВЫХОД 18:15:30 09-11-2009
18725


я не пойму в какой величине возвращает mktime?
 

StiM

Новичок
разностью между двумя mktime'ами является количество секунд.

18725 / 3600 чуть больше 5 часов.
 

Фанат

oncle terrible
Команда форума
StiM
может быть, стоило бы проводить эти вычисления в базе данных?
 

StiM

Новичок
Вот тебе нормальный вывод. Почитай про функцию date().

PHP:
// ВХОД
$time1 = '2009-11-09 13:03:25';
// ВЫХОД
$time2 = '2009-11-09 18:15:30';

$t1 = explode(" ", $time1);
$t2 = explode(" ", $time2);
$d1 = explode("-", $t1['0']);
$d2 = explode("-", $t2['0']);
$ti1 = explode(":", $t1['1']);
$ti2 = explode(":", $t2['1']);

echo "<b>ВХОД</b>&nbsp; ".$ti1[0]. ':'. $ti1[1].':'.$ti1[2].' '.$d1[1].'-'.$d1[2].'-'.$d1[0] . "<br>";
echo "<b>ВЫХОД</b>&nbsp; ".$ti2[0]. ':'. $ti2[1].':'.$ti2[2].' '.$d2[1].'-'.$d2[2].'-'.$d2[0] . "<br>";

$tm = mktime($ti2[0],$ti2[1],$ti2[2],$d2[2],$d2[1],$d2[0]) - mktime($ti1[0],$ti1[1],$ti1[2],$d1[2],$d1[1],$d1[0]);

echo date("H:m:s",$tm);
 

jone31

Новичок
да, спасибо. Но мне нужно разница только в часах. :)
PHP:
echo intval((mktime($ti2[0],$ti2[1],$ti2[2],$d2[1],$d2[2],$d2[0]) - mktime($ti1[0],$ti1[1],$ti1[2],$d1[1],$d1[2],$d1[0]))/ 3600);
 

Dovg

Продвинутый новичок
StiM
Ты глубоко заблуждаешься.

Не нужно парсить даты как строки, если с ними можно работать как с датами на уровне субд. О чем и писал **************** пару постов назад.
 

RUNET

Новичок
и таки наверное вместо explode лучше сделать так ...
PHP:
preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/', $time1, $tm1);
зы и вообще, надо юзнать unix timestamp и проблем таких не будет ...
 

jone31

Новичок
Автор оригинала: Dovg
StiM
Ты глубоко заблуждаешься.

Не нужно парсить даты как строки, если с ними можно работать как с датами на уровне субд. О чем и писал **************** пару постов назад.
ну так подскажите как с ними работать на уровне СУБД, в примерах. :)
 

jone31

Новичок
Автор оригинала: RUNET
и таки наверное вместо explode лучше сделать так ...
PHP:
preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/', $time1, $tm1);
для чего?

Автор оригинала: RUNET
зы и вообще, надо юзнать unix timestamp и проблем таких не будет ...
на момент постройки бд я не планировал что мой проект приобретет такое развитие как сейчас. :)
 

Dovg

Продвинутый новичок
mysql к сожалению уже успел забыться.

в postgres как-то так
Код:
=> SELECT age ('2009-11-19 18:16:17', '2009-11-19 14:46:18');
   age
----------
 03:29:59
(1 row)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
мне хотелось бы увидеть пример...
п.1. Выбрать из таблицы А
значения нужных полей и/или TIMEDIFF(Б.time, A.time)
(приджойнить таблицу Б п.2)
При A.type = 'STATE_IN'

п.2. По условию, что A.id = Б.id и Б.type='STATE_OUT'

-~{}~ 19.11.09 16:13:

Стоп.
Внимание, вопрос, что у тебя хранится в id?
 
Сверху