Sql 我需要返回两列7个月的每日总和

Sql 我需要返回两列7个月的每日总和,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我需要返回两列7个月的每日总和 我正试图这样做,但这太耗时了。有没有一种方法可以按一天一次递增的顺序返回这些值 select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/1/2013 07:00:00' and '1/2/2013 7:00:00' select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nol

我需要返回两列7个月的每日总和 我正试图这样做,但这太耗时了。有没有一种方法可以按一天一次递增的顺序返回这些值

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/1/2013 07:00:00' and '1/2/2013 7:00:00'

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/2/2013 07:00:00' and '1/3/2013 7:00:00'

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/3/2013 07:00:00' and '1/4/2013 7:00:00'

select SUM(TotalBet)SALES, SUM(totalbet)PRIZES from play nolock where CurrentDate between '1/4/2013 07:00:00' and '1/5/2013 7:00:00'

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/5/2013 07:00:00' and '1/6/2013 7:00:00'

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/6/2013 07:00:00' and '1/7/2013 7:00:00'
使用生成日期,然后按日期加入表和组。你可以直接进入表格,但是如果你错过了日期,比如说,如果没有数字表格,他们就不会在结果中显示假期

SELECT 
   D.Date, SUM(TotalBet) as Sales, SUM(TotalBet) as Prizes
FROM (
   SELECT DATEADD(dd, CONVERT(datetime, '2013-01-01 07:00'), Number) as Date
   FROM dbo.NumbersTable(0, 210) --210 days
) as D
LEFT OUTER JOIN Play as P ON
   P.CurrentDate >= D.Date AND P.CurrentDate < D.Date
GROUP BY
   D.Date

您可能也不希望使用BETWEEN,因为可能会在BETWEEN的边界上出现重复项,因为它包含在两侧。

您需要一个聚合。关键是将日期时间转换为日期。要获得正确的日期,请减去7小时:

select cast(CurrentDate - 7.0/24 as date) as thedate,
       SUM(TotalBet) as SALES, SUM(totalbet) as PRIZES
from play nolock
group by cast(CurrentDate - 7.0/24 as date)
order by 1;

我不得不猜测一下你在追求什么,但我认为以下方法是有效的:

select
  AdminDate,
  SUM(TotalBet) SALES,
  SUM(totalbet) PRIZES --Unless the DB has a CS collation, this is identical to the above
from
    (select
        DATEADD(day,DATEDIFF(day,0,DATEADD(hour,-7,CurrentDate)),0) as AdminDate,
        TotalBet
    from play
    ) t
where AdminDate >= '20130101' and AdminDate < '20130801'
group by AdminDate
order by AdminDate asc

注意,这将不能从使用索引中获益——如果重要的话,请考虑将计算添加到表

中作为计算列。 关键是要创建这个AdminDate列,它首先从CurrentDate中减去7小时,然后从结果中删除时间部分-这会导致从今天早上7点到明天早上7点之前的每个datetime值,出于管理目的,都被视为今天发生过。一旦我们有了这些AdminDate,就可以很容易地对这些数据进行分组,以找到每个AdminDate的总数


注意,我还从查询中删除了nolock,因为它没有执行您认为它正在执行的操作。在原始查询中,它为play表引入了一个名为nolock的别名。如果您确实需要查询不对表执行任何锁定,那么您希望与NOLOCK一起使用

CurrentDate列是否已索引?如果没有,考虑索引它,这将增加这样的请求当前日期的性能是索引xDI刚刚更新,其中时间帧需要从7:00到6:59:59i不能编辑实际数据,添加列不是一个选项。我现在意识到了。我将请求更新为从7:00:00运行到6:59:59@KevinW-你还是会错过几毫秒。只要用正确的方法,使用严格的