2013-04-25 3 views
0

У меня есть две таблицы projects и project_hours, с одним до многих (один проект, много часов).MySQL количество часов между несколькими датами

Вот мои две таблицы:

CREATE TABLE `projects` (
    `project_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `client_id` int(10) unsigned NOT NULL, 
    `project_name` char(50) NOT NULL, 
    `project_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`project_id`), 
    KEY `project_owner` (`client_id`), 
    CONSTRAINT `projects_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `clients` (`client_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 

CREATE TABLE `project_hours` (
    `hours_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `project_id` int(10) unsigned NOT NULL, 
    `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `end_time` datetime NOT NULL, 
    PRIMARY KEY (`hours_id`), 
    KEY `project_id` (`project_id`), 
    CONSTRAINT `project_hours_ibfk_1` FOREIGN KEY (`project_id`) REFERENCES `projects` (`project_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

То, что я хотел бы сделать, это выбрать все проекты, а также получить сумму часов, так что у меня есть окончательный список проектов с общим количеством часов. Поэтому, если у меня есть 1 проект, 2 записи в project_hours, я бы хотел получить 1 строку назад, а не 2 строки.

Вот что я пробовал. То, что я получаю, это 2 строки, и каждый временной интервал составляет менее 1 часа, поэтому current_hours отображается как 0. Что я могу сделать, чтобы суммировать две строки вверх? получить 1,50 или что-то в этом роде?

select *, datediff(start_time, end_time) * 60 as current_hours from projects 
left join project_hours using(project_id) 
where client_id = 2 
+0

Срок действия датой истекает в разные дни. ваш запрос никогда не будет работать так, как есть, потому что 'some_number_of_days * 60' ** ** ** **. –

+0

ха-ха, да, я просто это понял. –

+0

Я думаю, что нашел ответ, хотя –

ответ

0

Здесь мы идем! Это, похоже, делает то, что я искал:

select *, sum(time_to_sec(timediff(end_time, start_time)))/60/60 as current_hours from projects 
left join project_hours using(project_id) 
where client_id = 2 
group by project_id