Синтаксис SQL: выбор результатов для каждой даты в диапазоне дат - PullRequest
0 голосов
/ 18 сентября 2009

У меня есть следующий 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 строкой для вышеперечисленных пунктов и прекрасно работает.

Я немного не уверен, как мне вернуть таблицу со значениями СУММ за день / неделю / месяц т.е. * +1008 *

  • Сумма всех значений для каждого ДНЯ в диапазоне дат.

  • Сумма всех значений для каждой НЕДЕЛИ в диапазоне дат.

  • Сумма всех значений для каждого МЕСЯЦА в диапазоне дат.

Я уверен, что есть простой способ сделать это, но я сам сомневаюсь. Я видел несколько учебных пособий, в которых используется команда DAY (дата), но я пытался и, похоже, не могу получить то, что мне нужно.

Я с нетерпением жду вашей превосходной помощи.

Ответы [ 3 ]

2 голосов
/ 18 сентября 2009

Вам понадобится таблица с днями между

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 голос
/ 18 сентября 2009

Вы добавляете предложение GROUP BY к вашему запросу:

к МЕСЯЦУ:

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);

по НЕДЕЛЕ:

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);

ДЕНЬ:

 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);

Для ДНЯ есть другие опции, такие как использование CAST для извлечения дневной части или функция FormatDateTime, которая у вас есть. Я использовал DATEPART для согласованности.

0 голосов
/ 18 сентября 2009

Посмотрите на команду DATEDIFF , она может дать вам количество дней / недель / месяцев / лет и т. Д. Между двумя датами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...