2010-03-31 88 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