【问题标题】:Adding time parts of an database result?添加数据库结果的时间部分?
【发布时间】:2018-04-25 13:00:05
【问题描述】:

我正在尝试在我的应用程序中添加一个功能,该功能按周、月等计算用户在系统中花费的总时间。

$select = "SELECT TOTAL_HRS FROM timeclock WHERE USERNAME = '$sessuser' AND CLOCK_OUT BETWEEN '$dbpast' AND '$dbnow'";

我有两个采样时间条目的 MySql 结果:00:00hr:04min:08s00: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 方面效率更高?非常感谢您的帮助。谢谢!

【问题讨论】:

  • 您如何存储用户花费的时间?将它存储在几秒钟内可能会更容易,或者作为带有开始和结束时间的时间戳。
  • ...我没想到。哈哈。我将开始和结束时间存储在我的数据库上的 DateTime 字段中,然后总计“会话时间”,将它们转换为字符串存储。我希望那些显示为字符串。 DateTime 和 Timestamp 有什么区别?
  • 时间戳是自 1970 年以来经过的秒数(当前为 1510524424)。日期时间是日期和时间。但是有一些函数可以减去日期时间。见stackoverflow.com/questions/10907750/…varchar 和数学将是一个巨大的痛苦,不要走那条路。

标签: php mysql datetime


【解决方案1】:

您可以使用TIMESTAMPDIFF() 计算两个日期时间值之间的秒数,然后将其相加。例如

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(),它为您提供了那些“时髦”的值

【讨论】:

  • 我实际上并没有在查询中使用 timediff(),我试图破解结果字符串,不幸的是,它错误地沿着那个兔子洞旅行。作为一个初学者,我所做的一切都是一次学习经历。您的回答为我的 php 文件节省了大量空间。谢谢!我能够使用以下答案将秒数转换为时间格式:stackoverflow.com/questions/3856293/…
  • 如果有任何机会使用数字来代替,请避免字符串操作 :) 这是一个 数字al 世界。请注意,日期和时间是数字 - 只是比 0 到 9 复杂一点
【解决方案2】:

我会这样做:

在数据库中创建一列以保存每个会话的现场时间。我可能会将其设置为整数而不是时间戳列。我只需要它返回一个数字。我会有一个单独的时间戳列来记录访问时间。

客户端绑定一个 javascript/jquery 函数到 window.onload 保存到本地存储/在页面加载时将 cookie 设置为当前时间戳,使用 moment.js 库向用户显示总站点时间并使其计数即时的。检查 cookie 是否已经存在,如果存在则在设置新值之前对其进行处理。

或者将另一个函数绑定到 window.onunload 以在用户离开网站时保存另一个带有时间戳的 cookie,或者使用 setInterval 在他们在网站上时每分钟左右保存最新的时间戳。

在页面加载时检查 cookie/localstorage 是否有值,然后从页面卸载的时间戳中减去页面加载的时间戳,以获得他们在网站上花费的秒数。将其保存到数据库并使用卸载事件的时间戳来设置他们访问的时间戳。

在数据库上运行相关查询以返回最后一天/一周/一个月的总秒数,并通过 ajax 将它们传递给 moment.js。它可以使用大约 2 行代码从包含以秒为单位的值的字符串中显示您所描述的计数器。

【讨论】:

  • 0_0 这很漂亮。我喜欢。我对 cookie 了解不多,但我将不得不开始将它们纳入未来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2016-03-28
  • 2016-07-04
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多