【问题标题】:mysql - row timestamp by hour of daymysql - 一天中每小时的行时间戳
【发布时间】:2021-05-20 15:13:48
【问题描述】:

我有一张如下表:

tmstp in tmstp out result
2021-01-30 14:10:00 2021-01-30 15:50:00 01:40:00
2021-01-30 15:55:00 2021-01-30 16:05:00 00:10:00
2021-01-30 19:00:00 2021-01-30 22:10:00 03:10:00

但我想知道在这样的表中:

tmstp in tmstp out result
2021-01-30 14:10:00 2021-01-30 14:59:59 00:49:59
2021-01-30 15:00:00 2021-01-30 15:50:00 00:50:00
2021-01-30 15:55:00 2021-01-30 15:59:59 00:04:59
2021-01-30 16:00:00 2021-01-30 16:05:00 00:05:00
2021-01-30 19:00:00 2021-01-30 19:59:59 00:59:59
2021-01-30 20:00:00 2021-01-30 20:59:59 00:59:59
2021-01-30 21:00:00 2021-01-30 21:59:59 00:59:59
2021-01-30 22:00:00 2021-01-30 22:10:00 00:10:00

这将是每一行在一小时内的扩展输出。行的间隔必须在一小时内

感谢您的帮助

【问题讨论】:

  • 你想用tmstp out做什么?你要更新吗?还是你想忽略它? (或其他东西......)
  • 你在使用什么数据库(我确实看到 Gordon 已删除 [sql-server])

标签: mysql sql date datetime


【解决方案1】:

我建议将时间调整为整点,而不是整点前一秒。

通过此更改,您可以使用递归 CTE:

with recursive cte as (
      select ts_in, date(ts_in) + interval hour(ts_in) + 1 hour as ts_hour_end, ts_out
      from t
      union all
      select ts_hour_end, date(ts_hour_end) + interval hour(ts_hour_end) + 1 hour, ts_out
      from cte
      where ts_hour_end < ts_out
     )
select ts_in, least(ts_hour_end, ts_out), timediff(least(ts_hour_end, ts_out), ts_in) as diff
from cte;

Here 是一个 dbfiddle。

【讨论】:

  • 感谢@Gordon Linoff 回答您的问题!完美运行。可以用 PL/SQL 方式编写此代码吗?
  • @TiagoOliveira 。 . .这基本上适用于 Oracle 12+,但您需要包含 CTE 列而不是 recursive 关键字,并调整日期算术。
猜你喜欢
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2020-08-13
相关资源
最近更新 更多