我的sql表中有以下数据:
Tran_Date | Amount
2013-05-01 20:09:49 | 50.00
2013-05-02 04:09:49 | 50.00
2013-05-02 04:30:49 | 10.00
2013-05-02 20:09:49 | 500.00
2013-05-03 03:09:49 | 0.00
如何在凌晨5点之前将金额分成今天和次日?结果如下:获得结果的目的是因为商店在早上8点开门,第二天凌晨5点关门。我必须在上午8点至凌晨12点之前计算总和,并在上午12点至凌晨5点之间将其计算为1天销售额。
Tran_Date | Amount | Amount_Before_5am
2013-05-01 20:09:49 | 50.00 | 60.00
2013-05-02 20:09:49 | 500.00 | 0.00
希望你们都能帮助我。我差不多一周尝试以下代码但什么都没得到。有可能吗?感谢
select CAST(DATEADD(hh, -5,c.TRAN_DATE) AS DATE),
CAST(c.TRAN_DATE as DATE),
sum(c.Amount)
from TRAN_TABLE
group by CAST(DATEADD(hh, -5,c.TRAN_DATE) AS DATE),
CAST(c.TRAN_DATE as DATE)
答案 0 :(得分:1)
您可以使用聚合来有效地执行此操作。
http://sqlfiddle.com/#!3/615d5/2
SELECT BusinessDay = CAST(DATEADD(hh,-5,TranDate) AS DATE)
,Amount = SUM(CASE WHEN DATEPART(hh,TranDate) > 4 THEN Amount ELSE 0 END)
,Amount_Before_5am =
SUM(CASE WHEN DATEPART(hh,TranDate) <= 4 THEN Amount ELSE 0 END)
FROM Table
GROUP BY CAST(DATEADD(hh,-5,TranDate) AS DATE)
答案 1 :(得分:0)
虽然您可以通过聚合执行此操作,但另一种方法是使用join
:
select tt.trandate, tt.amount, ttnext.amount
from Tran_table tt left outer join
Tran_Table ttnext
on hour(ttnext.tran_date) < 5 and
cast(ttnext.tran_date as DATE) = CAST(tt.tran_date + 1 as DATE)
where hour(tt.tran_date) >= 5;
这假设数据符合您在问题中的描述。在凌晨5点之前或同一天凌晨5点之后的多个值会导致重复的行。
答案 2 :(得分:0)
SELECT Tran_Date
, Amount
, Amount_Before_5am = SUM(CASE WHEN CAST('Tran_Date' AS TIME) <'05:00:00' THEN Amount ELSE 0 END)
FROM TRAN_TABLE
GROUP BY Tran_Date, Amount
很难从你的问题中判断出你是否正在聚合。如果你是,那么这应该工作。如果您没有聚合,那么只需关闭SUM()即可。您也可以像其他人所说的那样使用DATEPART比较。
哦,你可能也想在白天总结金额?只需将其包装在SUM()中,然后从Group By子句中删除Amount。