2010-03-31 2 views
5

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

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 
... 

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

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

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

ответ

1

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

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

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, datediff(dd, 0, OrderDate)) является первым получить «количество дней, прошедших с начала времени до даты» (далее datediff -части) а затем добавьте это количество дней в «начало времени». Это дает вам «начало вашего дня». Надеюсь, это понятно :)

2

Вот хороший трюк. Если вы разыгрываете 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) 

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

+0

Ваш Кронштейны был в неправильном порядке CAST (FLOOR (CAST ([OrderDate] AS FLOAT)) AS DATETIME) – Imrul

+0

Спасибо, фиксированная (я надеюсь) – Jamiec

2

U можно использовать CAST к дате типа

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' 
+0

+1; Хорошее решение, но оно работает только в SQL 2008 (не в SQL 2005, так как там нет типа DATE). – scherand

Смежные вопросы