我每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工作,不确定它是不是正确的方法。
答案 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
- 部分),然后将此天数添加到“时间的开头“。这给你“一天的开始”。我希望这是可以理解的:)