我正在尝试在我的应用程序中添加一项功能,该功能总计用户按周,月等在系统中花费的时间。
$select = "SELECT TOTAL_HRS FROM timeclock WHERE USERNAME = '$sessuser' AND CLOCK_OUT BETWEEN '$dbpast' AND '$dbnow'";
我有两个采样时间条目的MySql结果:00:00hr:04min:08s
和00:00hr:12min:52s
。用户可以拥有更多。
TOTAL_HRS是一个varchar列,所以当我在它上面放一个sum()时,它会返回0.
这是我到目前为止所拥有的:
while($row = $query->fetch_assoc()){
print_r($row);
$sanitized = preg_replace("/[^0-9:]+/", "", $row);
print_r($sanitized);
$joinarr = implode(':', $sanitized);
$parts = explode(':', $joinarr);
print_r($parts);
$zerodate = new DateTime('0000-01-01 00:00:00');
$addhrs += $parts[1];
$addmin += $parts[2];
print_r($addhrs);
$interval = $zerodate->add(new DateInterval('P' .$parts[0].'DT'.$parts[1].'H'.$parts[2].'M'.$parts[3].'S'));
$totalhrs = $interval->format('%D:%Hhr:%Imin:%Ss');
print_r($totalhrs);
}
我得到了时髦的垃圾:0%Sat:%0012Sat, 01 Jan 0000 00:12:52 +0100:%001121:%st52
我需要返回的内容是:00:00hr:17min:00s
。我不打算存储它,只是希望它显示在页面上。
我需要一些帮助来解决这个问题。我相信有更好的方法。我在功能上并不是那么棒。或者我应该通过jquery发送结果并在那里处理它们?哪一方在处理DateTime方面更有效率?非常感谢帮助。谢谢!
答案 0 :(得分:0)
我会这样做:
在数据库中创建一个列以保存站点上的每个会话时间。我可能会将其设置为整数而不是时间戳列。我只需要它来返回一个数字。我有一个单独的时间戳列来记录访问时间。
客户端将javascript / jquery函数绑定到window.onload,该函数保存到localstorage /将cookie设置为页面加载时的当前时间戳,使用moment.js库显示用户的总站点时间并将其计入即时的。检查cookie是否已经存在,如果是,则在设置新值之前处理它们。
将另一个函数绑定到window.onunload,以便在用户离开网站时使用时间戳保存另一个cookie,或者使用setInterval在网站上每分钟左右保存最新时间戳。
在页面加载时检查cookie / localstorage是否具有值,然后从页面卸载的时间戳中减去页面加载的时间戳,以获得它们在站点上花费的秒数。将其保存到数据库并使用unload事件的时间戳来设置其访问的时间戳。
在数据库上运行相关查询以返回最后一天/周/月的站点总秒数,并通过ajax将它们传递给moment.js。它可以使用大约2行代码从包含值的字符串中显示一个类似于你描述的计数器。
答案 1 :(得分:0)
您可以使用TIMESTAMPDIFF()
计算两个日期时间值之间的秒数,然后求和。 e.g。
SELECT SUM(TIMESTAMPDIFF(SECOND,CLOCK_IN,CLOCK_OUT)) AS TOTAL_SECS
FROM timeclock
WHERE USERNAME = '$sessuser' AND CLOCK_OUT BETWEEN '$dbpast' AND '$dbnow'
请参阅:https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff
您目前可能正在使用TIMEDIFF()
,它会为您提供那些" funky"价值