2013-05-18 57 views
2

我在SQL表以下数据:总和的不同日期的总

Tran_Date   | Amount 
2013-05-01 20:09:49 | 50.00 
2013-05-02 04:09:49 | 50.00 
2013-05-02 20:09:49 | 500.00 

我想第二天上午05点之前总结的量。结果如下。

Amount 
100.00 
500.00 

我尝试下面的代码,但结果是错误的:

SELECT DATEADD(hh, 5, DATEADD(dd, DATEDIFF(dd, 0, DATEADD(dd,1,f.TRAN_DATE)) AS sDate, 
     SUM(Amount) 
FROM TRAN_TABLE 
GROUP BY sDate 

如何达致这?感谢

+2

请显示您的企图... –

+0

对不起,我是新手在sql –

+0

为什么给它一个减号,这是一个合理的问题 – Tim

回答

1

你需要减去5小时,后组提取DATE即:

SELECT 
    CAST(DATEADD(hour, -5, TRAN_DATE) AS DATE) AS sDate, 
    SUM(Amount) 
FROM TRAN_TABLE 
GROUP BY CAST(DATEADD(hour, -5, TRAN_DATE) AS DATE) 
+0

看起来基本上与Richard的答案的第二部分相同,除非您引入了一个错误,因为它无法在SQL Server中引用“GROUP BY”中的列别名。 –

+0

也不(谢天谢地)SQL Server支持'GROUP BY'列顺序。 –

+0

@MartinSmith我想知道组中的别名 - 现在修好了。我知道SQL Server是落后的,但我一直忘记多远(我从来没有使用它)。我看了richards,但不明白'[date] ='whacky语法,所以我使用了标准的sql语法。我没有注意到剩下的 - 我发现它基本上是相同的(我没有“复制”)。 – Bohemian

4

对于任何SQL Server版本

select [Date]=DATEADD(DAY,DATEDIFF(DAY,0,DATEADD(HOUR,-5,Tran_Date)),0), 
     Total=SUM(Amount) 
from tbl 
group by DATEADD(DAY,DATEDIFF(DAY,0,DATEADD(HOUR,-5,Tran_Date)),0) 
order by [Date]; 

对于SQL Server 2008+,可以使用DATE数据类型

select [Date]=CAST(DATEADD(HOUR,-5,Tran_Date) as date), 
     Total=SUM(Amount) 
from tbl 
group by CAST(DATEADD(HOUR,-5,Tran_Date) as date) 
order by [Date]; 
+0

感谢你的回答,即使我不能使用你的答案,但你给了我一个想法该怎么做。非常感谢你。 –

+1

你能解释为什么你不能使用答案吗? – RichardTheKiwi

+0

Ops ...我认为格式不正确。但是我尝试后代码工作得很好,非常感谢。 –