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

Откуда:
Сообщений: 89
Имеется датчик который выходит в сеть и подает сигналы...0-это датчик не работает...1-работает
нам надо время(промежуток времени когда он работал т.е. когда значение 1 т.е полный отчет времени когда работал)как реализовать?спс большое заранее очень надо!!!!
по value вычислить time по time вычислит время работы например 4 5 6 будет 5 часов и т.п

id time value

1 29.06.2012 12:30 1-вкл
2 29.06.2012 13:30 0-выкл
3 29.06.2012 14:30 0
4 29.06.2012 15:30 1
5 29.06.2012 16:30 1
6 29.06.2012 17:30 1
7 ------------18:30- 0
... и т.д.

1 29.06.2012 12:30 1-вкл
2 29.06.2012 13:30 0-выкл
3 29.06.2012 14:30 0
4 29.06.2012 15:30 0
5 29.06.2012 16:30 0
6 29.06.2012 17:30 1

может и так быть
24 сен 12, 20:41    [13215205]     Ответить | Цитировать Сообщить модератору
 Re: вычислить промежуток времени работы помогите очень надо  [new]
ilik_121188
Member

Откуда:
Сообщений: 89
ilik_121188,

ой 4 часа работы сорри
24 сен 12, 20:43    [13215213]     Ответить | Цитировать Сообщить модератору
 Re: вычислить промежуток времени работы помогите очень надо  [new]
Mnior
Member

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

Но проблема в том что у вас раздутые данные, это как картинку в BMP хранить. Бессмысленно.
В базе нужно хранить только изменения системы. Раздуть обратно проще и быстрее.
В любых системах с датчиками это производственная необходимость.
Хотя это понятие верно для абсолютно всех систем.
25 сен 12, 01:50    [13216299]     Ответить | Цитировать Сообщить модератору
 Re: вычислить промежуток времени работы помогите очень надо  [new]
ilik_121188
Member

Откуда:
Сообщений: 89
дайте ссылочку плз....или напишите не нашел тут........оччень надо...или скиньте....спасибо большое...
25 сен 12, 07:22    [13216405]     Ответить | Цитировать Сообщить модератору
 Re: вычислить промежуток времени работы помогите очень надо  [new]
Добрый Э - Эх
Guest
ilik_121188
дайте ссылочку плз....или напишите не нашел тут........оччень надо...или скиньте....спасибо большое...


Ссылка

смотри темы по свертки периодов
25 сен 12, 07:27    [13216409]     Ответить | Цитировать Сообщить модератору
 Re: вычислить промежуток времени работы помогите очень надо  [new]
ilik_121188
Member

Откуда:
Сообщений: 89
надо найти смена 1 на ноль и ноль на единицу и потом от одного отнять другое..примерно так подсказали..но как это сделать незнаем
25 сен 12, 08:11    [13216462]     Ответить | Цитировать Сообщить модератору
 Re: вычислить промежуток времени работы помогите очень надо  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
+ Код
DECLARE	 @Table TABLE (
	 ID		Int		IDENTITY	PRIMARY KEY
	,[DateTime]	SmallDateTime	NOT NULL	UNIQUE
	,[Type]		Bit		NOT NULL
)INSERT	@Table ([DateTime],[Type]) VALUES
	 ('20120629 12:30',1)
	,('20120629 13:30',0)
	,('20120629 14:30',0)
	,('20120629 15:30',1)
	,('20120629 16:30',1)
	,('20120629 17:30',1)
	,('20120629 18:30',0)
	,('20120630 12:30',1)
	,('20120630 13:30',0)
	,('20120630 14:30',0)
	,('20120630 15:30',0)
	,('20120630 16:30',0)
	,('20120630 17:30',1)
-- В лоб
;WITH
Res AS (
	SELECT	 L.*
		,Row_Number()OVER(ORDER BY L.[DateTime]) - 1	AS Ord
	FROM	          @Table	L
--		LEFT JOIN @Table	R ON R.ID = L.ID - 1
		OUTER APPLY (
			SELECT	Top(1) *
			FROM	@Table	R
			WHERE	R.[DateTime] < L.[DateTime]
			ORDER BY R.[DateTime] DESC
				)	R
	WHERE	   R.[Type] != L.[Type]
		OR R.[Type] IS NULL
)	SELECT	 Max(CASE WHEN [Type] = 1 THEN [DateTime] END)	AS [From]
		,Max(CASE WHEN [Type] = 0 THEN [DateTime] END)	AS [To]
	FROM	Res
	GROUP BY Ord/2

-- Потоком
;WITH Ord AS (SELECT [DateTime],[Type],Row_Number()OVER(ORDER BY [DateTime]) AS ID FROM @Table),Prev AS (
	SELECT	 *
--		,Lag([Type])OVER(ORDER BY [DateTime])		AS Prev
		,CASE	WHEN ID % 2 = 1 THEN Convert(Bit,Max(CASE WHEN ID % 2 = 0 THEN Convert(TinyInt,[Type]) END)OVER(PARTITION BY  ID      / 2))
			WHEN ID % 2 = 0 THEN Convert(Bit,Max(CASE WHEN ID % 2 = 1 THEN Convert(TinyInt,[Type]) END)OVER(PARTITION BY (ID - 1) / 2))
			END	AS Prev
--	FROM	@Table
	FROM	Ord
),Res AS (
	SELECT	 L.*
		,Row_Number()OVER(ORDER BY L.[DateTime]) - 1	AS Ord
	FROM	Prev	L
	WHERE	   Prev != [Type]
		OR Prev IS NULL
)	SELECT	 Max(CASE WHEN [Type] = 1 THEN [DateTime] END)	AS [From]
		,Max(CASE WHEN [Type] = 0 THEN [DateTime] END)	AS [To]
	FROM	Res
	GROUP BY Ord/2
1 окт 12, 12:08    [13248577]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить