【问题标题】:MySQL query to group timestamps by daysMySQL查询按天分组时间戳
【发布时间】:2015-02-12 22:45:14
【问题描述】:

我有一个员工登录表,我正在尝试为员工生成他本周每天工作小时数的摘要。

我的桌子看起来像这样:

id | user | time_in             | time_out            | break
-------------------------------------------------------------
1  | 6    | 2014-12-14 05:00:00 | 2014-12-14 07:00:00 | 15
2  | 6    | 2014-12-14 09:00:00 | 2014-12-14 14:00:00 | 30
3  | 6    | 2014-12-14 14:00:00 | 2014-12-14 20:00:00 | 0
4  | 6    | 2014-12-15 08:00:00 | 2014-12-15 11:00:00 | 15

break 的值以分钟为单位,因此我通过time_out - time_in - 60 * break 计算员工当天的小时数。 time_intime_out 值的类型为 TIMESTAMP

这是我目前的查询。它似乎为day 返回null,我不知道为什么。

SELECT
    SUM(UNIX_TIMESTAMP(`time_out`) - UNIX_TIMESTAMP(`time_in`) - (`break` * 60)) AS `time`,
    DATE_FORMAT(FROM_UNIXTIME(`time_in`), "%Y-%m-%d") AS `day`
FROM `sign_ins`
WHERE
    `time_in` >= "2014-11-30 00:00:00" AND
    `time_out` <= "2014-12-07 00:00:00" AND
    `user` = 6
GROUP BY `day`
ORDER BY `day` ASC;

【问题讨论】:

  • 你为什么要为日期时间格式DATE_FORMAT(FROM_UNIXTIME(time_in), "%Y-%m-%d") AS day的日期值做from_unixtime()
  • 我应该提到它们实际上是TIMESTAMP 类型。据我了解,这是转换它们并去掉时间值的唯一方法,以便我可以使用 GROUP 按星期几将它们组合在一起。

标签: mysql sql select timestamp


【解决方案1】:

从上面的架构来看,您似乎没有为 time_in 和 time_out 字段使用时间戳。因此,您的查询中的更正应该是..

SELECT
    SUM(UNIX_TIMESTAMP(`time_out`) - UNIX_TIMESTAMP(`time_in`) - (`break` * 60)) AS `time`,
    DATE_FORMAT(`time_in`, "%Y-%m-%d") AS `day`
FROM 
    `sign_ins`
WHERE
    `time_in` >= "2014-11-30 00:00:00" AND
    `time_out` <= "2014-12-07 00:00:00" AND
    `user` = 6
GROUP BY `day`
ORDER BY `day` ASC;

另外,我不确定您是否通过减去时间戳来获得时差来正确使用它。应该是这样的..

SUM(TIMESTAMPDIFF(MINUTE, `time_out`, `time_in`) - (`break` * 60))

【讨论】:

  • 谢谢!我使用TIMESTAMP 作为类型,但删除FROM_UNIXTIME 对我有用。另外感谢TIMESTAMPDIFF的建议,我会研究一下。
猜你喜欢
  • 1970-01-01
  • 2011-07-24
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多