У меня есть некоторые числовые данные, которые прибывают через каждые 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 в данный момент, не уверенный, если это - правильный способ пойти об этом.
Вы можете использовать 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'
Я не понимаю, как вы могли бы использовать для этого 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
-часть), а затем добавьте это количество дней к «началу времени». Это дает вам «начало дня». Надеюсь, это понятно :)
Вот хороший трюк. Если привести 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)
Я понятия не имею, является ли этот способ более/менее эффективным, чем все предыдущие правильные ответы.