我正在尝试在我的应用程序中添加一个功能,它将用户在系统中花费的时间按周、月等计算出来。
$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的效率更高?我将非常感谢你的帮助。谢谢!
发布于 2017-11-13 01:53:43
您可以使用TIMESTAMPDIFF()
计算两个日期时间值之间的秒数,然后将其和起来。例如:
SELECT SUM(TIMESTAMPDIFF(SECOND,CLOCK_IN,CLOCK_OUT)) AS TOTAL_SECS
FROM timeclock
WHERE USERNAME = '$sessuser' AND CLOCK_OUT BETWEEN '$dbpast' AND '$dbnow'
请参阅:timestampdiff
您目前可能使用的是TIMEDIFF()
,它为您提供了“时髦”的值。
发布于 2017-11-13 00:42:35
我会这样做:
在数据库中创建一个列,以保存站点上的每个会话时间。我可能会将它设置为整数,而不是时间戳列。我只需要它给我一个号码。我会有一个单独的时间戳列来记录访问的时间。
客户端将javascript/jquery函数绑定到window.onload,该函数保存到本地存储/在加载页面时将cookie设置为当前时间戳,使用moment.js库向用户显示站点总时间,并使其实时计数。检查cookie是否已经存在,如果已经存在,则在设置新值之前对其进行处理。
或者将另一个函数绑定到window.onunload,以便在用户离开站点时使用时间戳保存另一个cookie,或者在用户在站点上时使用setInterval每分钟保存一次最新的时间戳。
在页面加载上,检查cookie/localstorage是否有值,然后从页面卸载的时间戳中减去页面加载的时间戳,以获得它们在站点上花费的秒数。将其保存到数据库中,并使用卸载事件的时间戳设置访问的时间戳。
在数据库上运行相关查询,在最后一天/周/月返回站点上的总秒,然后通过ajax将它们传递给moment.js。它可以用大约2行代码从包含值的字符串中显示计数器,如您所描述的那样。
https://stackoverflow.com/questions/47254274
复制相似问题