2010-03-31 87 views
5

我有一些数值数据每隔5分钟出现一次(即每天288个值,以及相当数天的数据)。我需要编写一个可以返回每天所有值的总和的查询。所以,目前的表看起来像这样:按时间段计算的总计SQL列值

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> 

查询将大大登打士web部件里面,所以很遗憾我无法编写自定义用户功能来帮助它。所有的逻辑都需要在一个大的查询中。任何帮助将不胜感激,谢谢。我正在尝试使用GROUP BY和DATEPART来处理这个问题,并不确定是否正确的解决方法。

回答

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 -part)然后将此天数添加到“开始时间”。这给了你“一天的开始”。我希望这是可以理解的:)

2

这是一个很好的窍门。如果你投一个SQL DATETIMEFLOAT它可以让你的日期days.fractionofday

因此,如果你是地板,并把它回DATETIME它给你minight指定的日期。

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) 

我不知道这是否比以前的正确答案更有效。

+0

你的支架是在错误的顺序 CAST(FLOOR(CAST([订购日期] AS FLOAT))AS DATETIME) – Imrul 2010-03-31 11:46:53

+0

谢谢,固定的(我希望) – Jamiec 2010-03-31 12:36:30

2

U可以通过根据该使用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' 
+0

+1;很好的解决方案,但它只能在SQL 2008中工作(不在SQL 2005中,因为那里没有“DATE”类型)。 – scherand 2010-04-07 06:33:14