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

Откуда:
Сообщений: 26
CREATE TABLE [dbo].[Orderz](
[code] [nvarchar](255) NULL,
[StartTime] [datetime] NULL,
[FinishTime] [datetime] NULL
)
Insert into Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 00:38:39.000',	'2018-09-25 01:20:13.000')
Insert into Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 00:40:52.000',	'2018-09-25 01:22:19.000')
Insert into Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 00:47:56.000',	'2018-09-25 01:36:55.000')
Insert into Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 01:01:14.000',	'2018-09-25 01:41:46.000')
Insert into Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-24 21:15:30.000',	'2018-09-25 01:46:50.000')
Insert into Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 01:01:14.000',	'2018-09-25 01:46:50.000')
Insert into Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 01:01:27.000',	'2018-09-25 02:00:29.000')
Insert into Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-24 20:49:54.000',	'2018-09-25 02:00:31.000')
Insert into Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 01:01:28.000',	'2018-09-25 02:04:41.000')
Insert into Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 01:01:28.000',	'2018-09-25 05:58:40.000')
Insert into Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-24 08:15:00.000',	'2018-09-25 09:23:14.000')


Надо в итоге при Select'е получить такую выборку:
'Code1', '2018-09-24 20:49:54.000', '2018-09-25 05:58:40.000'
'Code1', '2018-09-24 08:15:00.000', '2018-09-25 09:23:14.000'

Заранее спасибо и прошу прощения за предоставленные неудобства.

Сорри за оффтопик, но поймите, на форуме могут встречаться вопросы от людей, для которых T-SQL не является профильным языком программирования и решать связанные с ним вопросы приходится эпизодически. В частности многие SCADA системы предоставляют язык sql запросов формата ansi-99 для решения допзадач, хотя их основной язык - какой-нибудь скриптовой.
Яркий пример - WinCC.

Модератор: Повтор, первая тема была тут. Пока оставлю открытой, может кто за автора и попользуется поиском.


Сообщение было отредактировано: 26 сен 18, 10:54
26 сен 18, 10:41    [21686385]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
Const123
Надо в итоге при Select'е получить такую выборку:
'Code1', '2018-09-24 20:49:54.000', '2018-09-25 05:58:40.000'
'Code1', '2018-09-24 08:15:00.000', '2018-09-25 09:23:14.000'

Сорри за оффтопик, но поймите, на форуме могут встречаться вопросы от людей, для которых T-SQL не является профильным языком программирования и решать связанные с ним вопросы приходится эпизодически.
Но по русски-то эти "люди" могут описать алгоритм получения нужных данных?
26 сен 18, 10:47    [21686394]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alexeyvg
Const123
Надо в итоге при Select'е получить такую выборку:
'Code1', '2018-09-24 20:49:54.000', '2018-09-25 05:58:40.000'
'Code1', '2018-09-24 08:15:00.000', '2018-09-25 09:23:14.000'

Сорри за оффтопик, но поймите, на форуме могут встречаться вопросы от людей, для которых T-SQL не является профильным языком программирования и решать связанные с ним вопросы приходится эпизодически.
Но по русски-то эти "люди" могут описать алгоритм получения нужных данных?

пусть угадывают, не барское это дело. Кстати для "не желающих" есть форум работа.
26 сен 18, 10:49    [21686396]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
Const123
Member

Откуда:
Сообщений: 26
TaPaK,
Вроде все понятно из результирующей выборки:
надо объединить пересекающиеся интервалы и выделить отдельно не пересекающиеся.
Оффтоп: а не факт, что сами не столкнетесь с такой же ситуацией, когда требуется срочная помощь, а вам просто посоветуют как типа правильно жить. Жизнь - штука сложная, за всякое праздно сказанное слово рано или поздно придется ответить. Не стоит жить по принципу: упавшего - добей.
26 сен 18, 11:17    [21686448]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Const123,
автор
надо объединить пересекающиеся интервалы и выделить отдельно не пересекающиеся

как по мне тут всё пересекается
'Code1', '2018-09-24 20:49:54.000', '2018-09-25 05:58:40.000'
'Code1', '2018-09-24 08:15:00.000', '2018-09-25 09:23:14.000'
26 сен 18, 11:20    [21686454]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
982183
Member

Откуда: VL
Сообщений: 3353
Только вчера Akina ответ дал
21684663
26 сен 18, 11:37    [21686476]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
Const123
Member

Откуда:
Сообщений: 26
TaPaK,
прошу прощения, число во втором значении результирующей выборки не так поставил:
'Code1', '2018-09-24 20:49:54.000', '2018-09-25 05:58:40.000'
'Code1', '2018-09-25 08:15:00.000', '2018-09-25 09:23:14.000'
26 сен 18, 11:45    [21686487]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
Const123
TaPaK,
прошу прощения, число во втором значении результирующей выборки не так поставил:
'Code1', '2018-09-24 20:49:54.000', '2018-09-25 05:58:40.000'
'Code1', '2018-09-25 08:15:00.000', '2018-09-25 09:23:14.000'

А разве не так должно получиться?

'Code1', '2018-09-24 20:49:54.000', '2018-09-25 05:58:40.000'

Присоединяюсь:
TaPaK
как по мне тут всё пересекается
26 сен 18, 16:32    [21687011]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
alexeyvg
Const123
TaPaK,
прошу прощения, число во втором значении результирующей выборки не так поставил:
'Code1', '2018-09-24 20:49:54.000', '2018-09-25 05:58:40.000'
'Code1', '2018-09-25 08:15:00.000', '2018-09-25 09:23:14.000'

А разве не так должно получиться?

'Code1', '2018-09-24 20:49:54.000', '2018-09-25 05:58:40.000'

Присоединяюсь:
TaPaK
как по мне тут всё пересекается


одно из двух.
или 2018-09-24 08:15:00.000 надо читать как 2018-09-25 08:15:00.000
или должен быть один диапазон

Code1 2018-09-24 08:15:00.000 2018-09-25 09:23:14.000

, так как он поглощает все остальные
26 сен 18, 16:37    [21687022]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
Посетитель
одно из двух.
или 2018-09-24 08:15:00.000 надо читать как 2018-09-25 08:15:00.000

Тогда будет всё равно один диапазон, только от '2018-09-24 20:49:54.000'

Поэтому я и спросил автора про формулировку алгоритма.

А когда алгоритм будет описан на русском, то и закодировать его будет легко.
27 сен 18, 02:10    [21687629]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
982183
Member

Откуда: VL
Сообщений: 3353
Так он описал
Const123
надо объединить пересекающиеся интервалы и выделить отдельно не пересекающиеся.

Только тестовые данные дал неверные.
27 сен 18, 02:18    [21687633]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
982183
Так он описал
Const123
надо объединить пересекающиеся интервалы и выделить отдельно не пересекающиеся.

Только тестовые данные дал неверные.
Это не алгоритм, а задача.

Но в общем алгоритм действительно тут несложный.
Можно сделать, например, в цикле (конечно, нужно добавить уникальный ИД, надеюсь, он же есть?):

CREATE TABLE #Orderz(
[id] int not null identity primary key,
[code] [nvarchar](255) NULL,
[StartTime] [datetime] NULL,
[FinishTime] [datetime] NULL
)
go
Insert into #Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 00:38:39.000',	'2018-09-25 01:20:13.000')
Insert into #Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 00:40:52.000',	'2018-09-25 01:22:19.000')
Insert into #Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 00:47:56.000',	'2018-09-25 01:36:55.000')
Insert into #Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 01:01:14.000',	'2018-09-25 01:41:46.000')
Insert into #Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-24 21:15:30.000',	'2018-09-25 01:46:50.000')
Insert into #Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 01:01:14.000',	'2018-09-25 01:46:50.000')
Insert into #Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 01:01:27.000',	'2018-09-25 02:00:29.000')
Insert into #Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-24 20:49:54.000',	'2018-09-25 02:00:31.000')
Insert into #Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 01:01:28.000',	'2018-09-25 02:04:41.000')
Insert into #Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-25 01:01:28.000',	'2018-09-25 05:58:40.000')
Insert into #Orderz ([code],[StartTime],[FinishTime]) VALUES ('Code1',	'2018-09-24 08:15:00.000',	'2018-09-25 09:23:14.000')
go

while 1=1
begin
	update o1
	set o1.StartTime = case when o1.StartTime > o2.StartTime then o2.StartTime else o1.StartTime end,
		o1.FinishTime = case when o1.FinishTime < o2.FinishTime then o2.FinishTime else o1.FinishTime end
	from #Orderz o1
		join #Orderz o2
			on o2.id <> o1.id
			and o2.StartTime <= o1.FinishTime
			and o2.FinishTime >= o1.StartTime
	if @@ROWCOUNT = 0
		break

	delete o1
	from #Orderz o1
	where exists(
			select * 
			from #Orderz o2
			where o2.id > o1.id
				and o2.StartTime = o1.StartTime
				and o2.FinishTime = o1.FinishTime
		)

end

select * from #Orderz
go
drop TABLE #Orderz
27 сен 18, 11:38    [21687965]     Ответить | Цитировать Сообщить модератору
 Re: Учет работы единиц оборудования  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
alexeyvg
Можно сделать, например, в цикле (конечно, нужно добавить уникальный ИД, надеюсь, он же есть?):
Да, забыл ещё по code связать, ну это уже детали
27 сен 18, 13:33    [21688128]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить