SQL语法:为一系列日期之间的每个日期选择结果

时间:2009-09-18 09:54:24

标签: sql sql-server tsql

我使用以下SQL(SQL Server 2005)来计算每列的总时间:

DECLARE @Param1 DATETIME
DECLARE @Param2 DATETIME
DECLARE @Param3 DATETIME

SET @Param1 = '2009-01-01'
SET @Param2 = '2009-09-09'

SELECT  SUM(IdleSec) AS TotalIdleSec, 
        SUM(ProductionSec) AS TotalProductionSec, 
        SUM(UplineSec) AS TotalUplineSec, 
        SUM(DownlineSec) AS TotalDownlineSec, 
        SUM(UserSec) AS TotalUserSec
FROM            Job
WHERE   (DateTime >= dbo.FormatDateTime(@Param1, 'yyyy-mm-dd')) 
        AND 
        (DateTime < dbo.FormatDateTime(@Param2, 'yyyy-mm-dd'))

GO

这会为上面的项目返回一个包含 1行的表,效果很好。

我有点不确定如何以每天/每周/每月的SUM值返回表格 即。

  • 日期范围内每个日期的所有值的总和。

  • 日期范围内每个WEEK的所有值的总和。

  • 日期范围内每个MONTH的所有值的总和。

我确信有一种简单的方法可以做到这一点,但不确定自己。我看过一些使用DAY(日期)命令的教程,但我尝试过,似乎无法得到我需要的东西。

我期待着您的出色帮助。

3 个答案:

答案 0 :(得分:2)

您需要一张日期为

的表格
DECLARE @StartDate DATETIME,
        @EndDate DATETIME

SELECT  @StartDate = '01 Sep 2009',
        @EndDate = '09 Sep 2009'

DECLARE @RunDate DATETIME
SELECT  @RunDate = @StartDate

DECLARE @DayTable TABLE(
        DayDate DATETIME
)

WHILE @RunDate <= @EndDate 
BEGIN
    INSERT INTO @DayTable (DayDate) SELECT @RunDate
    SET @RunDate = @RunDate + 1
END

SELECT * FROM @DayTable

然后将查找表连接到此表,并按日期表中的日期分组。

这应该为您提供每日价值

然后你需要为每周值做同样的事情。这将为您提供所有日子,即使该日期没有统计数据

答案 1 :(得分:1)

您可以在查询中添加GROUP BY子句:

MONTH:

SELECT  SUM(IdleSec) AS TotalIdleSec, 
        SUM(ProductionSec) AS TotalProductionSec, 
        SUM(UplineSec) AS TotalUplineSec, 
        SUM(DownlineSec) AS TotalDownlineSec, 
        SUM(UserSec) AS TotalUserSec,
        DATEPART(year, DateTime) as Year,
        DATEPART(month, DateTime) as Month
FROM            Job
WHERE   (DateTime >= dbo.FormatDateTime(@Param1, 'yyyy-mm-dd')) 
        AND 
        (DateTime < dbo.FormatDateTime(@Param2, 'yyyy-mm-dd'))
GROUP BY DATEPART(year, DateTime),
        DATEPART(month, DateTime);
WEEK

SELECT  SUM(IdleSec) AS TotalIdleSec, 
        SUM(ProductionSec) AS TotalProductionSec, 
        SUM(UplineSec) AS TotalUplineSec, 
        SUM(DownlineSec) AS TotalDownlineSec, 
        SUM(UserSec) AS TotalUserSec,
        DATEPART(year, DateTime) as Year,
        DATEPART(week, DateTime) as Week
FROM            Job
WHERE   (DateTime >= dbo.FormatDateTime(@Param1, 'yyyy-mm-dd')) 
        AND 
        (DateTime < dbo.FormatDateTime(@Param2, 'yyyy-mm-dd'))
GROUP BY DATEPART(year, DateTime),
        DATEPART(week, DateTime);

by DAY:

 SELECT  SUM(IdleSec) AS TotalIdleSec, 
        SUM(ProductionSec) AS TotalProductionSec, 
        SUM(UplineSec) AS TotalUplineSec, 
        SUM(DownlineSec) AS TotalDownlineSec, 
        SUM(UserSec) AS TotalUserSec,
        DATEPART(year, DateTime) as Year,
        DATEPART(dayofyar, DateTime) as Day
FROM            Job
WHERE   (DateTime >= dbo.FormatDateTime(@Param1, 'yyyy-mm-dd')) 
        AND 
        (DateTime < dbo.FormatDateTime(@Param2, 'yyyy-mm-dd'))
GROUP BY DATEPART(year, DateTime),
        DATEPART(dayofyear, DateTime);

对于DAY,还有其他选项,例如使用CAST提取日期部分或您似乎拥有的FormatDateTime函数。我使用DATEPART来保持一致性。

答案 2 :(得分:0)

查看DATEDIFF命令,这可以为您提供两个日期之间的天数/周/月/年等数字。