我正在尝试使用PHPMyAdmin设置MySQL数据库。在我深入研究之前,我需要建议并进行查询。我像这样设置了表格。
id: primary ket
time_in: date
time_out: date
task: varchar (128)
business: varchar (128)
我需要做的就是跟踪每项任务和业务花费的时间。这是做这件事的好方法还是有更好的方法?
如果这是正确的,那么我试图弄清楚如何查询时间。这就是我提出的查询,但它远非我想要的。
SELECT `Task`,`Business`, (SELECT `Time-Out` - `Time-In`) as `total time` FROM `Sheet`
有没有办法将总时间转换为更易读的格式?
答案 0 :(得分:0)
您需要使用TIMEDIFF(end_time,start_time)和TIME_TO_SEC(时间)将差异转换为总秒数。然后,您可以将数学上的秒数转换为您想要的任何格式。
所以在每项任务的时间:
select ID
,task
,business
,time_to_sec(timediff(time_out, time_in)) as duration
from sheet
按任务和业务汇总:
select task
,business
,sum(time_to_sec(timediff(time_out,time_in))) as total_time
from sheet
group by task
,business
答案 1 :(得分:0)
除非您在几天内跟踪时间,否则我建议您对TIME
和DATETIME
列使用time_in
或time_out
。
就个人而言,我可能会使time_out
可以为空,以便跟踪当前的活动(我已经开始但尚未完成)。
不需要使用子选择来减去时间戳,您也可以内联减去这两列(只需删除SELECT
关键字)。对于格式化,您可以使用TIMEDIFF
函数:
SELECT '12:00:00' - '10:45:00';
-> 2
SELECT TIMEDIFF('12:00:00', '10:45:00');
-> '01:15:00'
这将使您的查询:
SELECT `Task`, `Business`, TIMEDIFF(`Time-Out`, `Time-In`) as `total time` FROM `Sheet`
如果 使time_out
(或Time-Out
)可以为空,您需要在查询中考虑到这一点:
SELECT TIMEDIFF(NULL, '10:45:00');
-> NULL
所以正在进行的任务会给total time
NULL。如果你想知道你已经工作了多长时间,可以将它包装在一个IFNULL
函数中并获得当前时间:
SELECT TIMEDIFF(IFNULL(`Time-Out`, NOW()), `Time-In`);
-> '01:15:00' if `Time-Out` is 12:00:00 and `Time-In` is 10:45:00
-> '02:05:13' if `Time-Out` is NULL and it's currently 12:50:13 (server time)