【问题标题】:Time difference without considering times between 0am ~ 4am. MySQL不考虑0am~4am之间的时差。 MySQL
【发布时间】:2020-06-17 07:17:30
【问题描述】:

MySQL 8.0 版

我想计算两个日期时间列之间的时间差。 并获取持续时间 >= 12:00:00 的行。

我通常会这样做:

select id
     , start_time
     , end_time
     , timediff(end_time, start_time) as duration
  from table;

我会得到这样的东西:

    id    start_time               end_time              duration
0   1   2020-06-01 01:00:00   2020-06-01 14:00:00        13:00:00
1   2   2020-06-01 01:00:00   2020-06-01 18:00:00        17:00:00
2   3   2020-06-01 19:00:00   2020-06-02 10:00:00        15:00:00
3   4   2020-06-02 04:00:00   2020-06-02 16:00:00        12:00:00

对于持续时间列,我不希望将 00:00:00 ~ 04:00:00 之间的时间添加到持续时间中。
所以对于第一行持续时间 = 10:00:00 自 01:00 :00~14:00:00 = 10:00:00,忽略 00:00:00 ~ 04:00:00 之间的时间

第二行也是如此,我们从持续时间中减去 3 小时。

所以我想要的输出是:

    id    start_time               end_time              duration
0   1   2020-06-01 01:00:00   2020-06-01 14:00:00        10:00:00
1   2   2020-06-01 01:00:00   2020-06-01 18:00:00        14:00:00
2   3   2020-06-01 19:00:00   2020-06-02 10:00:00        11:00:00
3   4   2020-06-02 04:00:00   2020-06-02 16:00:00        12:00:00

有很多行的时间也包括分钟和秒。

提前致谢!

我已经抓取了所有持续时间 >= 12:00:00 的行。

然后根据 start_time 将数据分成 4 个区域。

a_region = 00~04
b_region = 04~12
c_region = 12~16
d_region = 16~24

对于 a_region,我减去了 04:00:00 - start_time,这是我们应该补偿 a_region 中的持续时间的时间。

补偿 = 04:00:00 - 开始时间
补偿时间 = 持续时间 - 补偿。

对于b_region,如果已经过了00~04就不需要补偿了,表示已经过了duration = 12:00:00。

对于 c_region,
补偿 = 16:00:00 - 开始时间
补偿时间 = 持续时间 - 补偿

对于 d_region,因为我们已经获取了持续时间 >= 12:00:00

因此它将通过所有 00~04 补偿时间 = 持续时间 - 04:00:00。

我使用 Python 解决了它,但上面是我使用的逻辑。

【问题讨论】:

  • 到目前为止你尝试过什么?你被困在哪里了?您确定要使用纯 MySQL 解决此问题吗?

标签: mysql datetime


【解决方案1】:

一个选项使用greatest()

select id
     , start_time
     , end_time
     , timediff(
        greatest(, 
            end_time,
            date_format(end_time,  '%Y-%m-%d 04:00:00')
        ),
        greatest(
            start_time, 
            date_format(start_time, '%Y-%m-%d 04:00:00')
        ) 
    ) as duration
from table;

【讨论】:

  • 嗯...不太符合您的回答。你能解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2012-02-18
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
相关资源
最近更新 更多