Совокупные значения столбцов SQL к периоду времени

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

03/30/2010 00:01:00  --   553   
03/30/2010 00:06:00  --   558   
03/30/2010 00:11:00  --   565  
03/30/2010 00:16:00  --   565  
03/30/2010 00:21:00  --   558   
03/30/2010 00:26:00  --   566  
03/30/2010 00:31:00  --   553   
...

И это продолжается для 'x' количества дней, я хотел бы, чтобы запрос возвратил 'x' количество строк, каждый из который содержащий сумму всех значений в каждый день. Что-то вроде этого:

03/30/2010  --  <sum>
03/31/2010  --  <sum>
04/01/2010  --  <sum>

Запрос войдет в Dundas webpart, поэтому к сожалению, я не могу записать пользовательские функции пользователя для помощи ему. Вся логика должна быть в просто одном большом запросе. Любая справка ценилась бы, спасибо. Я пытаюсь заставить это работать с помощью GROUP BY и DATEPART в данный момент, не уверенный, если это - правильный способ пойти об этом.

5
задан OMG Ponies 31 March 2010 в 05:09
поделиться

3 ответа

Вы можете использовать CAST на дату type

SELECT [ENTRY_DATE],CAST([ENTRY_DATE] AS date) AS 'date' 
FROM [PROFIT_LIST]

Теперь вы можете группировать по этому.

SELECT CAST([ENTRY_DATE] AS date) AS 'date',SUM(PROFIT) 
FROM [PROFIT_LIST]
GROUP BY CAST([ENTRY_DATE] AS date) AS 'date'
2
ответ дан 14 December 2019 в 19:08
поделиться

Я не понимаю, как вы могли бы использовать для этого DATEPART , поскольку он не может возвращать только часть даты в значении DATETIME (поправьте меня, если я ошибаюсь). Что действительно работает, так это использование DATEADD для «обнуления» времени и группировка по значению формы ГГГГ-ММ-ДД 00: 00: 00.000 .

Следующий запрос работает с базой данных Adventure Works, если она у вас есть (проверено на SQL Server 2005). За исключением использования DATEADD , это очень похоже на предложение @OMG Ponies:

select
    dateadd(dd, 0, datediff(dd, 0, OrderDate)) as SaleDay
    , sum(taxamt) as Amount
from
    Sales.SalesOrderHeader
group by
    dateadd(dd, 0, datediff(dd, 0, OrderDate))
order by
    SaleDay

Идея dateadd (dd, 0, datiff (dd, 0, OrderDate)) должна быть первой получите «количество дней, прошедших от начала времени до вашей даты» ( dateiff -часть), а затем добавьте это количество дней к «началу времени». Это дает вам «начало дня». Надеюсь, это понятно :)

1
ответ дан 14 December 2019 в 19:08
поделиться

Вот хороший трюк. Если привести SQL DATETIME к FLOAT, это даст вам дату в виде days.fractionofday

Поэтому если вы пересчитаете ее и вернете в DATETIME, это даст вам minight на заданную дату.

CAST(FLOOR(CAST(MyDateTime  AS FLOAT)) AS DATETIME)

Поэтому мой любимый способ сделать это.

select
    CAST(FLOOR(CAST(OrderDate AS FLOAT)) AS DATETIME)
    , sum(taxamt) as Amount
from
    Sales.SalesOrderHeader
group by
        CAST(FLOOR(CAST(OrderDate AS FLOAT)) AS DATETIME)

Я понятия не имею, является ли этот способ более/менее эффективным, чем все предыдущие правильные ответы.

2
ответ дан 14 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: