【问题标题】:SQL Server DateTime IntervalsSQL Server 日期时间间隔
【发布时间】:2015-11-05 08:10:38
【问题描述】:

在表格中,我有来自传感器的数据。活动值由传感器每 15 分钟发送一次。现在,我想每天计算 2 次这些值的平均值。例如,一天的第一个平均值将是 00:00:00 到 12:00:00 的平均值,同一天的第二个平均值将是 12:00:00 到 23:59 之间的平均值: 59.

我的TimeStampByNode 列以datetime2 格式存储日期时间, 即“2015-09-02 02:03:04”

我使用此查询来获取每日平均值,即所有 24 小时的平均值;

SELECT 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)), 
    ROUND(AVG(Value), 2) 
FROM 
    data_record2 
WHERE 
    Node_ID = 55554321 AND Value_Type = 'Activity'
GROUP BY 
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode))
ORDER BY  
    DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) DESC 

如何修改它以获得 2 个每日平均值?

【问题讨论】:

    标签: sql sql-server datetime average


    【解决方案1】:

    每天做两个不同的平均值怎么样?在 ELSE 情况下返回的 NULL 确保不会将它们放入平均值中。

    SELECT 
        DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)), 
         -- Start --
        ROUND(AVG(CASE WHEN DATEPART(HH, TimeStampByNode) < 12 
              THEN Value ELSE NULL END), 2) as AVG_AM,
        ROUND(AVG(CASE WHEN DATEPART(HH, TimeStampByNode) >= 12 
              THEN Value ELSE NULL END), 2) as AVG_PM
        -- End --
    FROM 
        data_record2 
    WHERE 
        Node_ID = 55554321 AND Value_Type = 'Activity'
    GROUP BY 
        DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode))
    ORDER BY  
        DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) DESC
    

    (缺少括号已编辑)

    【讨论】:

    • 我收到一条错误消息,指出“AVG 函数需要 1 个参数。”
    • 它返回错误的计算。第一个答案是返回正确的值。在不满足大小写的情况下是否与传递空值有关?
    • 啊 - 第二个条件应该是 >= 12
    【解决方案2】:

    您需要在GROUP BY 子句中添加以下条件:

     ...
    GROUP BY (...), case when (DATEPART(hh, TimeStampByNode) < 12) then 1 else 0 end
     ...
    

    所以这将变成:

    SELECT 
        DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)), 
        ROUND(AVG(Value), 2) 
    FROM 
        data_record2 
    WHERE 
        Node_ID = 55554321 AND Value_Type = 'Activity'
    GROUP BY 
        DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode))
      , case when (DATEPART(hh, TimeStampByNode) < 12) then 1 else 0 end
    ORDER BY  
                DATEFROMPARTS(YEAR(TimeStampByNode), MONTH(TimeStampByNode), DAY(TimeStampByNode)) DESC 
    

    【讨论】:

    • 谢谢!这工作正常。但是,我如何区分一天中哪个时间段的值?第一个值将始终用于案例 1?第二个是case2?
    • 如果需要,您可以在 select 子句中执行相同操作:case when (DATEPART(hh, max(TimeStampByNode)) &lt; 12) then "Before 12" else "After" end 'Type of Interval'
    • 抱歉,没有得到“间隔类型”部分!
    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2020-04-11
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多