Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сложение получасовок в час  [new]
palem
Member

Откуда:
Сообщений: 13
Доброго времени!
~~~
Опрашиваем приборы учета, храним значения в БД в виде получасовок, за сутки на один прибор учета приходится 48-записей (48-получасовок в сутках), подскажите пожалуйста каким образом составить заброс на выборку чтобы получить часовые значения (складывая 2 получасовки в час)?
11 сен 12, 13:01    [13145344]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Glory
Member

Откуда:
Сообщений: 104751
palem
храним значения в БД в виде получасовок,

"Получасовка" - это такой тип данных что ли ?
11 сен 12, 13:04    [13145369]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
GROUP BY

Забанить надо за нубские вопросы детсадовского уровня.
11 сен 12, 13:07    [13145398]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
aleks2
Guest
Mnior
GROUP BY

Забанить надо за нубские вопросы детсадовского уровня.


Не, ну представь, что тут остались ты да я, да иные "тока отвечающие" - чо делать то будем?
11 сен 12, 14:09    [13145899]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
aleks2
чо делать то будем?
Писать свой скуль с блекдж...
А вообще когда нормальные вопросы подымаются многие ("тока отвечающие") голову в песок прячут
FAQ допиливать, в бложек писать ...
Если на форуме затишье, может это повод заняться чем-то более полезным, а не в детсад скатываться. Каждому своё место, чё всё до кучи мешать.

Но если вам так нраица (отдушина) - ваше дело. Против толпы не попрёшь.
Меня лично очень напрягает подход "пользуюсь тем чего понимать не хочу" жутко бесит это гуманитарная тупизна времён неандертальцев. Не профессионально.
А детишек воодушевлять не ответами "на конкретный вопрос", а красивыми решениями правильного подхода (далеко не уровня SQL) и где личное присутствие более желательно.

IMXO
11 сен 12, 15:32    [13146739]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
palem,

/*
DECLARE @tab TABLE (nn INT, d1 INT)
INSERT INTO @tab ( nn, d1 ) VALUES  ( 1, 30)  -- получасы (1) и минуты (30)
INSERT INTO @tab ( nn, d1 ) VALUES  ( 2, 60)
INSERT INTO @tab ( nn, d1 ) VALUES  ( 3, 90)
INSERT INTO @tab ( nn, d1 ) VALUES  ( 4, 120)
INSERT INTO @tab ( nn, d1 ) VALUES  ( 5, 150)
INSERT INTO @tab ( nn, d1 ) VALUES  ( 6, 180)
INSERT INTO @tab ( nn, d1 ) VALUES  ( 7, 210)
*/

--SELECT dateadd(day,datediff(day,(0),GETDATE()),(0))

DECLARE @tab_date TABLE (dd smalldatetime)
INSERT INTO @tab_date (dd ) VALUES  ('20120911 00:24:12.120')
INSERT INTO @tab_date (dd ) VALUES  ('20120911 01:45:12.120')
INSERT INTO @tab_date (dd ) VALUES  ('20120911 18:45:12.089')
INSERT INTO @tab_date (dd ) VALUES  ('20120911 23:45:12.089')

SELECT 
dd,
1+ DATEDIFF(MI, dateadd(day,datediff(day,(0),GETDATE()),(0)), dd) AS minut,  
1 + (DATEDIFF(MI, dateadd(day,datediff(day,(0),GETDATE()),(0)), dd)/30) AS half_hour
FROM @tab_date
11 сен 12, 17:07    [13147573]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
palem
каким образом составить заброс на выборку

на выборку из чего? где структура, пример данных и эталонный результат?
11 сен 12, 17:16    [13147629]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
Зайцев Фёдор,

Прочитав и перечитав "описание" от ТС, предполагаю, что на самом деле всё выглядит примерно так:

declare @table1 table (
	[device_id]	int							NULL,
	[somedate]	datetime				NULL,
	[value]			decimal(38,19)	NULL
);

declare
	@i					int,
	@startdate	datetime,
	@somedate		datetime,
	@somevalue	decimal(38,19)
;

set @startdate = '2012-09-11 00:00:00.000';
set @i = 0;
while @i <= 47
begin
	set @somedate = dateadd(minute,30*@i,@startdate);
	set @somevalue = rand();
	insert into @table1 (device_id, somedate, value)
	values (1, @somedate, @somevalue);
	set @i = @i + 1;
end;

select * from @table1;
11 сен 12, 17:35    [13147743]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
Зайцев Фёдор,
вар2:

declare @table1 table (
	[device_id]	int							NULL,
	[somedate]	datetime				NULL,
	[value]			decimal(38,19)	NULL
);

declare
	@i						int,
	@startdate		datetime,
	@enddate			datetime,
	@currentdate	datetime,
	@somevalue		decimal(38,19),
	@increment		int
;

set @startdate = '2012-09-11 00:00:00.000';
set @enddate = dateadd(day,1,@startdate);
set @currentdate = @startdate;
while @currentdate <= @enddate
begin
	set @somevalue = rand();
	insert into @table1 (device_id, somedate, value)
	values (1, @currentdate, @somevalue);
	set @increment = cast(rand()*300 as int);
	set @currentdate = dateadd(second,@increment,@currentdate);
end;

select * from @table1;

select
	sq.datehour,
	sum(sq.value) as hour_sum
from (
select
	t.value,
	datepart(hour,t.somedate) as datehour
from @table1 as t) as sq
group by sq.datehour;
11 сен 12, 17:54    [13147839]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
thrashead
+
Зайцев Фёдор,
вар2:

declare @table1 table (
	[device_id]	int							NULL,
	[somedate]	datetime				NULL,
	[value]			decimal(38,19)	NULL
);

declare
	@i						int,
	@startdate		datetime,
	@enddate			datetime,
	@currentdate	datetime,
	@somevalue		decimal(38,19),
	@increment		int
;

set @startdate = '2012-09-11 00:00:00.000';
set @enddate = dateadd(day,1,@startdate);
set @currentdate = @startdate;
while @currentdate <= @enddate
begin
	set @somevalue = rand();
	insert into @table1 (device_id, somedate, value)
	values (1, @currentdate, @somevalue);
	set @increment = cast(rand()*300 as int);
	set @currentdate = dateadd(second,@increment,@currentdate);
end;

select * from @table1;

select
	sq.datehour,
	sum(sq.value) as hour_sum
from (
select
	t.value,
	datepart(hour,t.somedate) as datehour
from @table1 as t) as sq
group by sq.datehour;

я себе это примерно так представляю
with Device as 
(
  select *
    from (values(1), (2), (3)) Q(deviceID)
), DT as
(
  select n = 1, dt = getdate()
  union all
  select n = n + 1, dt = dateadd(minute, 30, dt)
    from DT
   where n < 48
), data as
(
  select A.deviceID, B.dt, value = A.deviceID + B.n
    from Device A
   cross join DT B
)
select deviceID,
       dt = dateadd(hour, datediff(hour, '', dt), ''),
       value = sum(value)
  from data
 group by deviceID, dateadd(hour, datediff(hour, '', dt), '')
 order by 1, 2
11 сен 12, 18:42    [13148130]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
накуя пудрить неокрепший моск тестовыми скриптами?
SELECT	 D.DeviceID
	,X.[Hour]
	,Sum(D.Value)	AS Value
FROM	dbo.Data D CROSS APPLY (SELECT
		 DateAdd(Hour,DateDiff(Hour,0,D.DT),0)
	) X ([Hour])
GROUP BY DeviceID
	,X.[Hour]
Вместо бы этого показали пример правильной стилистики, а не распространяли своё месиво неправильного форматирования и использования.
Алиасы надо писать всегда, не Copy&Past-ить (использовать APPLY).

А данные можно заполнять используя master.dbo.sp_values или директиву GO <Num>
11 сен 12, 21:29    [13148662]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Mnior
накуя пудрить неокрепший моск тестовыми скриптами?
SELECT	 D.DeviceID
	,X.[Hour]
	,Sum(D.Value)	AS Value
FROM	dbo.Data D CROSS APPLY (SELECT
		 DateAdd(Hour,DateDiff(Hour,0,D.DT),0)
	) X ([Hour])
GROUP BY DeviceID
	,X.[Hour]

снимаю шляпу! после такого мастера пудрить моск я бы решился ))
Вместо этого
Вместо бы этого показали пример правильной стилистики, а не распространяли своё месиво неправильного форматирования и использования.
Алиасы надо писать всегда, не Copy&Past-ить (использовать APPLY).

А данные можно заполнять используя master.dbo.sp_values или директиву GO <Num>

именно вместо этого и показали )
12 сен 12, 01:24    [13149211]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Зайцев Фёдор
снимаю шляпу! после такого мастера пудрить моск я бы решился ))
О да, прям круче чем яйца.
Столько пафоса, но при этом нуль конкретики.
Это как услышать одинокий смех в зале.

Дет сад.
12 сен 12, 10:38    [13150129]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Mnior
Столько пафоса, но при этом нуль конкретики.

ок, смешно конкретно это
Mnior
не Copy&Past-ить (использовать APPLY)
и это
Mnior
пример правильной стилистики
12 сен 12, 10:49    [13150202]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Зайцев Фёдор,
Mnior
не Copy&Past-ить (лучше использовать APPLY или т.п.)
И вчём прикол?
Mnior
пример правильной стилистики
А шо, писать без алиасов (номера в ORDER BY ну и тому подобное) типа лучше?
Или вы подумали что я имею ввиду именно только табуляцию, запятые ...?
Не это чисто пример, за форматирование драться бесполезно.
12 сен 12, 15:10    [13152286]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ничего, что все примеры просуммируют часы от разных суток ?

select convert(datetime, convert(varchar(14),GETDATE(),120)+'00',120)
12 сен 12, 15:16    [13152356]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Glory
Ничего, что все примеры просуммируют часы от разных суток ?

select convert(datetime, convert(varchar(14),GETDATE(),120)+'00',120)

ТС указал, что "за сутки на один прибор учета приходится 48-записей (48-получасовок в сутках)", но нигде не сказано,
1) что начало и конец суток (промежутка времени) непременно в одной дате
2) что час datepart(hour, mydate), а не момент времени

т.о. да, всё нормально
12 сен 12, 15:32    [13152500]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Mnior
Зайцев Фёдор,
Mnior
не Copy&Past-ить (лучше использовать APPLY или т.п.)
И вчём прикол?

IMHO, связь между Copy&Past и APPLY не совсем очевидна
предполагая, что под APPLY скрывается CROSS/OUTER APPLY
Mnior
пример правильной стилистики
А шо, писать без алиасов (номера в ORDER BY ну и тому подобное) типа лучше?
Или вы подумали что я имею ввиду именно только табуляцию, запятые ...?[/quot]
честно говоря, да, именно так и подумал.
не сразу понял, что речь шла о замене dateadd(hour, datediff(hour, '', dt), '') на X.[Hour], что позволило бы заменить - в этом случае мне как бы не лениво было писать ORDER BY многабукаф
я в любом случае не предложил бы APPLY (не относится к стилю), а любые претензии к стилю за пределами (из-за пределов) моей команды считаю странными.
12 сен 12, 15:56    [13152675]     Ответить | Цитировать Сообщить модератору
 Re: Сложение получасовок в час  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Зайцев Фёдор
я в любом случае не предложил бы APPLY
Почему?
Очень необходимый костыль для обхода плохой архитектуры языка.

Меня вообще поражает невероятная однобокость развития. Разнообразия недоразвитых языков полукровок тысчи (от Сей до C#, от JS до ...), постоянно появляются, постоянно "развиваются", а декларативные и в частности SQL - обделили вниманием практически полностью. Все эти нововведения должны были лет 15 назад появится. Признать что синтаксис говно, но некому - все считают фантики.
12 сен 12, 23:39    [13154998]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить