【问题标题】:Select distinct and get sum of timestamp differences选择不同的并获取时间戳差异的总和
【发布时间】:2014-12-08 02:38:58
【问题描述】:

我不知道这是否可能,但这真的很棒。我有一个登录表,供在不同项目上记录时间的人使用,我需要为每个项目在给定时间段内记录时间的报告。

我的桌子看起来像这样:

id | project | time_in             | time_out            | break
----------------------------------------------------------------
1  | 1       | 2014-12-07 05:00:00 | 2014-12-07 10:00:00 | 30
2  | 2       | 2014-12-07 06:00:00 | 2014-12-07 13:00:00 | 15
3  | 1       | 2014-12-07 14:00:00 | 2014-12-07 18:00:00 | 0
4  | 3       | 2014-12-07 08:30:00 | 2014-12-07 18:45:00 | 75
5  | 2       | 2014-12-07 12:00:00 | 2014-12-07 16:30:00 | 0

我想做的是在给定日期范围的情况下获取每个项目记录的时间报告,即每个项目记录的总时间(可能以秒为单位)。

time_intime_outTIMESTAMP 类型的字段; break 是一个整数,表示此人的休息时间分钟。我需要为每个项目获取time_out - time_in - break 的总和,例如12 月 7 日:

project | time
---------------
1       | 34200
2       | 40500
3       | 34200

这就是我目前所拥有的:

SELECT DISTINCT
    `project`
FROM `sign_ins`
WHERE
    `time_in` >= '2014-12-07 00:00:00' AND
    `time_out` <= '2014-12-08 00:00:00';

感谢您对此提供的帮助,SO 社区。你们真是太棒了。

【问题讨论】:

  • 我看到的一个问题是,您无法区分此人休息的时间。如果有time_in在12/7之前,time_out在12/7或之后的情况,他们休息了,你不知道休息的哪个部分落在12/7。
  • 是的,这是架构中的潜在限制。但是,该界面将超时限制为与时间相同的日期(或第二天午夜),即如果您在下午 6 点到早上 6 点工作,则需要记录两个条目:第一天下午 6 点到 12 点,上午 12 点到早上 6 点第二,分别输入休息时间。

标签: mysql sql datetime select distinct


【解决方案1】:

您可以通过将日期/时间值转换为 Unix 时间戳来获得以秒为单位的差异。然后,只需使用sum() 聚合差异:

SELECT project,
       SUM(UNIX_TIMESTAMP(time_out) - UNIX_TIMESTAMP(time_in) - (break * 60)) as DiffSecs
FROM `sign_ins`
WHERE `time_in` >= '2014-12-07 00:00:00' AND
      `time_out` <= '2014-12-08 00:00:00'
GROUP BY project;

【讨论】:

  • 你遗漏了休息部分:)
  • 我可以SUM(UNIX_TIMESTAMP(time_out) - UNIX_TIMESTAMP(time_in) - break * 60),对吧?
  • @MMiller 不,你需要在 break*60 周围加上括号,看看我对他的回答所做的编辑
  • 非常感谢你们的帮助,伙计们。我不应该需要括号,对吧?运算顺序不是意味着首先计算乘法,还是 SQL 总是从左到右计算?
  • @JohnRuddell 。 . .谢谢。
猜你喜欢
  • 2012-02-28
  • 2014-05-04
  • 2019-04-20
  • 2021-08-18
  • 2020-11-13
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多