【问题标题】:splitting up timeFrom and timeTo into hour intervals将 timeFrom 和 timeTo 拆分为小时间隔
【发布时间】:2016-02-26 03:05:57
【问题描述】:

我有以下几点:

TimeFrom                    TimeTo
2015-08-04 11:00:00.000     2015-08-04 14:00:00.000
2015-08-04 18:00:00.000     2015-08-04 20:00:00.000
2015-08-04 21:00:00.000     2015-08-04 23:00:00.000

我想创建一个可以给我所有小时间隔的东西。像这样:

TimeFrom                    TimeTo
2015-08-04 11:00:00.000     2015-08-04 12:00:00.000
2015-08-04 12:00:00.000     2015-08-04 13:00:00.000
2015-08-04 13:00:00.000     2015-08-04 14:00:00.000
2015-08-04 18:00:00.000     2015-08-04 19:00:00.000
2015-08-04 19:00:00.000     2015-08-04 20:00:00.000
2015-08-04 21:00:00.000     2015-08-04 22:00:00.000
2015-08-04 22:00:00.000     2015-08-04 23:00:00.000

有没有简单的方法来实现这一点?这似乎应该很常见,但找不到与此相关的任何内容。

我有很多天的记录,差不多一年。所有单独的记录(timeFrom、timeTo)都在同一天内(它们不跨越多天)。

我正在使用 PrestoDB

【问题讨论】:

  • 一个时间间隔是否可能跨越两个不同的日子,例如(TimeFrom, TimeTo) = (2015-08-04 11:00:00.000, 2015-08-05 03:00:00.000)
  • 不,在这个数据集中是不可能的。

标签: mysql sql presto


【解决方案1】:

您可以使用数字表:

SELECT DATE_ADD('HOUR', i - 1, TimeFrom) AS TimeFrom, 
       DATE_ADD('HOUR', i, TimeFrom) AS TimeTo
FROM (SELECT 1 AS i UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
      UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8
      UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
      UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16
      UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20
      UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24
) AS numbers
INNER JOIN mytable ON numbers.i <= DATE_DIFF('HOUR', TimeFrom, TimeTo)
ORDER BY TimeFrom

注意:上述查询使用DATE_ADDDATE_DIFF 记录的here PrestoDB 日期和时间函数。

【讨论】:

  • 太棒了!什么是“mytable”本身就是一个子查询?我将在哪里定义该子查询?我可以将它插入上面的“mytable”吗?对不起,SQL 语法的新手。
  • @Javier mytable 只是您的表,而不是子查询。
  • 我的意思是如果*对不起。说它是一个子查询。
  • @Javier 在这种情况下,是的,您可以使用它来代替 mytable 并使用别名,例如 INNER JOIN (SELECT TimeFrom, TimeTo FROM ... ) AS mytable ON numbers.i &lt;= DATE_DIFF(HOUR, TimeFrom, TimeTo)
  • 我不断收到:无法在此行解析列“小时”:DATE_DIFF(HOUR, TimeFrom, TimeTo)
【解决方案2】:

如果没有另一个每小时列出的表格,我看不到实现的方法。如果您仅限于一天,您可以使用 UNION ALL 在查询中构造它来伪造它

SELECT h.Hour
  FROM ( SELECT 2015-08-04 00:00:00.000 AS Hour
         UNION ALL SELECT 2015-08-04 01:00:00.000    
         UNION ALL SELECT 2015-08-04 02:00:00.000  
         UNION ALL SELECT 2015-08-04 03:00:00.000  
         UNION ALL SELECT 2015-08-04 04:00:00.000  
         UNION ALL SELECT 2015-08-04 05:00:00.000  
         UNION ALL SELECT 2015-08-04 06:00:00.000  
         UNION ALL SELECT 2015-08-04 07:00:00.000  
         UNION ALL SELECT 2015-08-04 08:00:00.000  
         UNION ALL SELECT 2015-08-04 09:00:00.000  
         UNION ALL SELECT 2015-08-04 10:00:00.000  
         UNION ALL SELECT 2015-08-04 11:00:00.000 
         UNION ALL SELECT 2015-08-04 12:00:00.000 
         UNION ALL SELECT 2015-08-04 13:00:00.000 
         UNION ALL SELECT 2015-08-04 14:00:00.000 
         UNION ALL SELECT 2015-08-04 15:00:00.000 
         UNION ALL SELECT 2015-08-04 16:00:00.000 
         UNION ALL SELECT 2015-08-04 17:00:00.000 
         UNION ALL SELECT 2015-08-04 18:00:00.000 
         UNION ALL SELECT 2015-08-04 19:00:00.000 
         UNION ALL SELECT 2015-08-04 20:00:00.000 
         UNION ALL SELECT 2015-08-04 21:00:00.000 
         UNION ALL SELECT 2015-08-04 22:00:00.000 
         UNION ALL SELECT 2015-08-04 23:00:00.000 ) AS h
where exists 
(select id from mytable where h>=TimeFrom and h<=TimeTo)

【讨论】:

  • 我不限于单日。我怎么能用另一张桌子做呢?对不起,我是 SQL 新手。你指的是加入吗?
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多