【问题标题】:How do I select the hours difference between the min start and max end of a given date period?如何选择给定日期期间的最小开始时间和最大结束时间之间的小时差?
【发布时间】:2014-03-11 21:46:10
【问题描述】:

我遇到了一个简单的问题,但是我很难尝试制定正确的 SQL 查询来完成这项工作。我有一张有多个日期的桌子。每个日期都有多次。时间是由用户手动添加的开始 - 结束增量。

+----+------------------+------------------+
| id | start            | end              |
+----+------------------+------------------+
|  6 | 2014/03/03 08:30 | 2014/03/03 09:00 |
|  7 | 2014/03/03 09:00 | 2014/03/03 11:15 |
|  8 | 2014/03/03 11:15 | 2014/03/03 11:45 |
|  9 | 2014/03/03 11:45 | 2014/03/03 12:45 |
| 10 | 2014/03/03 12:45 | 2014/03/03 13:15 |
| 11 | 2014/03/04 08:45 | 2014/03/04 09:00 |
| 12 | 2014/03/04 09:00 | 2014/03/04 13:00 |
| 13 | 2014/03/04 13:00 | 2014/03/04 13:30 |
| 14 | 2014/03/05 09:00 | 2014/03/05 09:30 |
| 15 | 2014/03/05 09:30 | 2014/03/05 12:30 |
| 16 | 2014/03/05 12:45 | 2014/03/05 12:45 |
| 19 | 2014/03/06 08:45 | 2014/03/06 09:00 |
| 20 | 2014/03/06 09:15 | 2014/03/06 10:00 |

我正在尝试计算每个日期的最早开始时间和最晚结束时间之间的小时差。

目前我只是在我的行上使用简单的unix_timestamp 转换,但是,它只计算找到的第一行之间的差异,而不是给定日期的所有行之间的差异。

select
    unix_timestamp(min(start)) - unix_timestamp(max(end)) / 60.0 / 60.0 as hours_difference,
    min(start) as started,
    min(end) as ended              
from
    athlete_log
group by
    day(start)

问题(如上所述)是它只抓取给定日期的第一行,例如:

| 6 | 2014/03/03 08:30 | 2014/03/03 09:00 |

但我需要最早开始时间和最晚开始时间:

|  6 | 2014/03/03 08:30 | 2014/03/03 09:00 |
|  7 | 2014/03/03 09:00 | 2014/03/03 11:15 |
|  8 | 2014/03/03 11:15 | 2014/03/03 11:45 |
|  9 | 2014/03/03 11:45 | 2014/03/03 12:45 |
| 10 | 2014/03/03 12:45 | 2014/03/03 13:15 |

应该产生的结果:

2014/03/03 8:30 - start
2014/03/03 13:15 - end
5.45 - hours_difference

当然只是选择

2014/03/03 8:30 - start
2014/03/03 9:00 - end
.30 - hours_difference

如何修改我的查询以选择给定日期的最小开始和最大结束?

【问题讨论】:

  • 为什么要转换?你试过timediff函数吗?

标签: php mysql sql


【解决方案1】:

您在DAY() 上进行了分组,这可能不正确。您只在那里显示 2014 年 3 月的数据,但如果您的数据库实际上有比这更多的月/年的数据,您将分组在一起 2014/03/03、2014/02/03、2013/02/03 等..(不同的年份/月份,同一天)

您应该使用GROUP BY DATE(start),因此您按照完整的YYYY-MM-DD 日期值分组。

【讨论】:

  • 刚刚试了一下,很遗憾没有任何作用。 :(
  • 你也在字段列表中选择了 min(end),不应该是 max(end) 吗?
  • 这是问题,是最大值。
【解决方案2】:

这就是你想要的

更新:第一次错过组,试试这个

SELECT A.starter - A.ender, dates
FROM(
SELECT Min([start]) as starter
      ,Max([end]) as ender
      ,CONVERT (DATE, [start]) as dates
  FROM athlete_log
  Group By CONVERT (DATE, [start]) ) as A

如果您只想要不需要顶部选择的值。内部选择获取顶层执行算术的值。如果您有任何问题,请随时提出。

【讨论】:

    【解决方案3】:

    可能是这样的

    SELECT started, ended, (unix_timestamp(ended) - unix_timestamp(started)) / (60.0 * 60.0)  as hours_difference
    FROM
    (
        SELECT DATE(start) AS start_date,
            MIN(start) as started,
            MAX(end) as ended              
        FROM athlete_log
        GROUP BY start_date
    ) Sub1;
    

    可以简写成这样

    SELECT DATE(start) AS start_date,
        MIN(start) as started,
        MAX(end) as ended,
        (unix_timestamp(MAX(end)) - unix_timestamp(MIN(start))) / (60.0 * 60.0) as hours_difference
    FROM athlete_log
    GROUP BY start_date;
    

    这里的 SQL 小提琴:-

    http://www.sqlfiddle.com/#!2/43757/7

    【讨论】:

      猜你喜欢
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多