Sample Query
SELECT
u.username as Username,
c.name as Customer,
DATE_FORMAT(t.start_time,'%Y-%m') as Date,
FORMAT(SUM(t.duration) / 3600, 0) as Duration
FROM
kimai2_timesheet t
LEFT JOIN kimai2_projects p ON t.project_id = p.id
LEFT JOIN kimai2_customers c ON p.customer_id = c.id
LEFT JOIN kimai2_users u ON t.user = u.id
WHERE
u.username = 'USERNAME'
AND
c.name = 'CUSTOMERNAME'
GROUP BY
t.user, u.username, u.alias, c.id, c.name, DATE_FORMAT(t.start_time,'%Y-%m')
ORDER BY
t.user,DATE_FORMAT(t.start_time,'%Y-%m')
;
Create Stored Procedure
DELIMITER //
CREATE PROCEDURE sum_weeks (IN user CHAR(20), IN customer CHAR (20) )
BEGIN
SELECT
u.username as Username,
c.name as Customer,
DATE_FORMAT(t.start_time,'%Y-%m') as Date,
FORMAT(SUM(t.duration) / 3600, 0) as Duration
FROM
kimai2_timesheet t
LEFT JOIN kimai2_projects p ON t.project_id = p.id
LEFT JOIN kimai2_customers c ON p.customer_id = c.id
LEFT JOIN kimai2_users u ON t.user = u.id
WHERE
u.username = user
AND
c.name = customer
GROUP BY
t.user, u.username, u.alias, c.id, c.name, DATE_FORMAT(t.start_time,'%Y-%m')
ORDER BY
t.user,DATE_FORMAT(t.start_time,'%Y-%m')
;
END//
DELIMITER ;
Call the procedure
mysql> CALL sum_weeks('USER','CUSTOMER');
+----------+----------+---------+----------+
| Username | Customer | Date | Duration |
+----------+----------+---------+----------+
| USER | CUSTOMER | 2014-01 | 10 |
| USER | CUSTOMER | 2014-02 | 2 |
+----------+----------+---------+----------+
2 rows in set (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
Do we have stored procedures?
SELECT db,name FROM mysql.proc WHERE db = ‘kimai’;
+——-+———–+
| db | name |
+——-+———–+
| kimai | sum_weeks |
+——-+———–+
1 row in set (0.00 sec)
SHOW PROCEDURE STATUS WHERE Db = ‘kimai’;
+——-+———–+———–+—————-+———————+———————+—————+———+———————-+———————-+——————–+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+——-+———–+———–+—————-+———————+———————+—————+———+———————-+———————-+——————–+
| kimai | sum_weeks | PROCEDURE | root@localhost | 2024-06-07 08:41:52 | 2024-06-07 08:41:52 | DEFINER | | latin1 | latin1_swedish_ci | latin1_swedish_ci |
+——-+———–+———–+—————-+———————+———————+—————+———+———————-+———————-+——————–+
1 row in set (0.00 sec)
Monthly reporting
DROP PROCEDURE IF EXISTS month_report;
DELIMITER //
CREATE PROCEDURE month_report (IN user CHAR(20), IN customer CHAR (20) )
BEGIN
IF customer IS NULL THEN
SELECT
DATE_FORMAT(t.start_time,'%Y-%m-%d') AS datum,
p.name AS konto,
a.name AS unterkonto,
t.duration / 3600 as Duration,
t.duration / 3600 as Duration,
t.description AS Comment
FROM
kimai2_timesheet t
LEFT JOIN kimai2_projects p on t.project_id = p.id
LEFT JOIN kimai2_customers c on p.customer_id = c.id
LEFT JOIN kimai2_users u on t.user = u.id
LEFT JOIN kimai2_activities a on t.activity_id = a.id
WHERE
u.username = user
AND
DATE_FORMAT(t.start_time,'%Y-%m') = DATE_FORMAT(CURRENT_DATE(),'%Y-%m')
ORDER BY
DATE_FORMAT(t.start_time,'%Y-%m-%d'), t.user, p.name
;
ELSE
SELECT
DATE_FORMAT(t.start_time,'%Y-%m-%d') AS datum,
p.name AS konto,
a.name AS unterkonto,
t.duration / 3600 as Duration,
t.duration / 3600 as Duration,
t.description AS Comment
FROM
kimai2_timesheet t
LEFT JOIN kimai2_projects p on t.project_id = p.id
LEFT JOIN kimai2_customers c on p.customer_id = c.id
LEFT JOIN kimai2_users u on t.user = u.id
LEFT JOIN kimai2_activities a on t.activity_id = a.id
WHERE
u.username = user
AND
c.name = customer
AND
DATE_FORMAT(t.start_time,'%Y-%m') = DATE_FORMAT(CURRENT_DATE(),'%Y-%m')
ORDER BY
DATE_FORMAT(t.start_time,'%Y-%m-%d'), t.user, p.name
;
END IF;
END//
DELIMITER ;
