按时间段聚合SQL列值

时间:2010-03-31 05:01:30

标签: sql sql-server

我每5分钟就有一些数字数据(即每天288个值,以及相当多的数据)。我需要编写一个可以返回每天所有值的总和的查询。所以目前这个表看起来像这样:

03/30/2010 00:01:00  --   553   
03/30/2010 00:06:00  --   558   
03/30/2010 00:11:00  --   565  
03/30/2010 00:16:00  --   565  
03/30/2010 00:21:00  --   558   
03/30/2010 00:26:00  --   566  
03/30/2010 00:31:00  --   553   
...

这种情况持续了'x'天,我希望查询返回'x'行数,每行包含每天所有值的总和。像这样:

03/30/2010  --  <sum>
03/31/2010  --  <sum>
04/01/2010  --  <sum>

查询将进入Dundas webpart,所以不幸的是我无法编写自定义用户函数来帮助它。所有逻辑都只需要在一个大查询中。任何帮助将不胜感激,谢谢。我正在努力让它在目前使用GROUP BY和DATEPART工作,不确定它是不是正确的方法。

3 个答案:

答案 0 :(得分:2)

这是一个很好的技巧。如果您将SQL DATETIME转换为FLOAT,则会将日期视为days.fractionofday

因此,如果您将其置之不理,并将其转回DATETIME,它会在给定日期为您提供最低价格。

CAST(FLOOR(CAST(MyDateTime  AS FLOAT)) AS DATETIME)

因此,我最喜欢这样做的方式是。

select
    CAST(FLOOR(CAST(OrderDate AS FLOAT)) AS DATETIME)
    , sum(taxamt) as Amount
from
    Sales.SalesOrderHeader
group by
        CAST(FLOOR(CAST(OrderDate AS FLOAT)) AS DATETIME)

我不知道这是否比之前的任何正确答案更多/更少有效。

答案 1 :(得分:2)

你可以使用 CAST 日期类型

SELECT [ENTRY_DATE],CAST([ENTRY_DATE] AS date) AS 'date' 
FROM [PROFIT_LIST]

现在你可以根据这个分组了。

SELECT CAST([ENTRY_DATE] AS date) AS 'date',SUM(PROFIT) 
FROM [PROFIT_LIST]
GROUP BY CAST([ENTRY_DATE] AS date) AS 'date'

答案 2 :(得分:1)

我看不出你如何使用DATEPART,因为它不能仅返回DATETIME值的日期部分(如果我弄错的话,请纠正我)。使用DATEADD使用YYYY-MM-DD 00:00:00.000形式的值“空白”时间和分组的工作是什么。

以下查询适用于Adventure Works数据库,以防您碰巧拥有它(在SQL Server 2005上测试)。除了使用DATEADD之外,它与@OMG小马的建议非常相似:

select
    dateadd(dd, 0, datediff(dd, 0, OrderDate)) as SaleDay
    , sum(taxamt) as Amount
from
    Sales.SalesOrderHeader
group by
    dateadd(dd, 0, datediff(dd, 0, OrderDate))
order by
    SaleDay

dateadd(dd, 0, datediff(dd, 0, OrderDate))的想法是首先获得“从开始到日期的天数”(datediff - 部分),然后将此天数添加到“时间的开头“。这给你“一天的开始”。我希望这是可以理解的:)