首页 > 解决方案 > 如何调节时间列?

问题描述

有一列代表 24 小时。数据每 15 分钟输入一次。例如,在 10:15,在 10H 列的 DateTime 列中输入值。但是... 客户想把当天的标准定在早上 6:30,然后把它定为第二天的 6:30。如果您查看下面的列,应该将第 6h 列的值相加。有什么办法吗?

DateTime             0H  1H   ..6H....7H...8H..9H..10H..~23H
2020 11 10 00:00:00  979 958 
2020 11 10 00:15:00  987 954 
2020 11 10 00:30:00  987 958 
2020 11 10 00:45:00  960 956 
2020 11 11 00:00:00    0 0 
2020 11 11 00:15:00    0 0 
2020 11 11 00:30:00    0 0 
2020 11 11 00:45:00    0 0 
2020 11 12 00:00:00  995 995 
2020 11 12 00:15:00  991 993 
2020 11 12 00:30:00 1000 993 
2020 11 12 00:45:00  993 996 

在此处输入图像描述

I want value
2020-11-15 06:30 ~ 2020-11-16 06:30 values sum

标签: mysqlsql

解决方案


考虑将小时块分成SELECT添加相应小时列的单独段。然后,通过 将所有部分绑定在一起UNION ALL。最后,为 final 聚合所有小时块SUM

下面总结了2020-11-15 06:30 - 2020-11-16 06:30(不包括上限)之间的所有值。请务必填写...所需列的缩写:

SELECT SUM(sub.HoursTotal) AS DayTotal
FROM
   (
    -- PARTIAL HOUR - 6:30 AM - 6:45 AM
    SELECT [6h] AS HoursTotal
    FROM myTable
    WHERE logdatetime BETWEEN '2020 11-15 00:30:00' AND  
                              '2020 11-15 00:45:00'

    UNION ALL

    -- FULL HOURS - 7:00 AM - 23:00 PM
    SELECT [7h] + [8h] + ... + [23h] AS HoursTotal
    FROM myTable
    WHERE logdatetime BETWEEN '2020 11-15 00:00:00' AND  
                              '2020 11-15 00:45:00'

    UNION ALL

    -- FULL HOURS - 12:00 AM - 5:00 AM
    SELECT [0h] + [1h] + ... + [5h] AS HoursTotal
    FROM myTable
    WHERE logdatetime BETWEEN '2020 11-16 00:00:00' AND  
                              '2020 11-16 00:45:00'
 
    UNION ALL

    -- PARTIAL HOUR - 6:00 AM - 6:15 AM
    SELECT [6h] AS HoursTotal
    FROM myTable
    WHERE logdatetime BETWEEN '2020 11-16 00:00:00' AND  
                              '2020 11-16 00:15:00'
  ) sub

当然,理想情况下,您的表会保持一个规范化的长格式结构,其中包含两列日期时间和值。然后,查询要容易得多:

logDateTimewithHour   Value
2020 11-15 00:00:00     ###
2020 11-15 00:15:00     ###
2020 11-15 00:30:00     ###
2020 11-15 00:45:00     ###
2020 11-15 01:00:00     ###
2020 11-15 01:15:00     ###
2020 11-15 01:30:00     ###
2020 11-15 01:45:00     ###
...                     ...
2020 11-16 22:00:00     ###
2020 11-16 22:15:00     ###
2020 11-16 22:30:00     ###
2020 11-16 22:45:00     ###
2020 11-16 23:00:00     ###
2020 11-16 23:15:00     ###
2020 11-16 23:30:00     ###
2020 11-16 23:45:00     ###
SELECT SUM(Value) AS DayTotal
FROM myLongTable
WHERE logDateTimewithHour BETWEEN '2020 11-15 06:30:00'
                              AND '2020 11-16 06:15:00'

推荐阅读