powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Анализ 8 дат. Как обойтись без курсора?
7 сообщений из 7, страница 1 из 1
Анализ 8 дат. Как обойтись без курсора?
    #32042477
Фотография AndreK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем!
Есть таблица с рядами дат, обозначающих отключение оборудования, начала ремонта, конца ремонта и подключения в работу, ну и в столбце i - номер агрегата. Примерно в таком духе:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
[/src]
i           o                           n                           k                           p                           
 ----------- --------------------------- --------------------------- --------------------------- --------------------------- 
 
 1             1984 - 04 - 10   00 : 00 : 00           1984 - 04 - 10   00 : 00 : 00           1984 - 04 - 29   00 : 00 : 00           1984 - 04 - 29   00 : 00 : 00 
 1             1986 - 05 - 20   00 : 00 : 00           1986 - 05 - 20   00 : 00 : 00           1986 - 06 - 10   00 : 00 : 00           1986 - 06 - 10   00 : 00 : 00 
 1             1986 - 05 - 22   00 : 00 : 00           1986 - 05 - 22   00 : 00 : 00           1986 - 06 - 10   00 : 00 : 00           1986 - 06 - 10   00 : 00 : 00 
 1             1986 - 08 - 25   00 : 00 : 00           1986 - 08 - 25   00 : 00 : 00           1986 - 09 - 13   00 : 00 : 00           1986 - 09 - 13   00 : 00 : 00 
 1             1986 - 11 - 12   00 : 00 : 00           1986 - 11 - 12   00 : 00 : 00           1986 - 01 - 12   00 : 00 : 00           1986 - 12 - 01   00 : 00 : 00 
[src]


Плюс к тому ремонты могут быть как с отключением, так и без оного, т.е. в строке дат откл.и подкл. может не быть (NULL)

Задача: проверить при Ins, Upd, Del на логическую достоверность, т.е. чтоб дата О (если она есть) не превышала предыдущую дату P, дата Р - последующую дату О, то же с началом и концами ремонтов (это кроме проверки по строке).

Я сейчас в триггере закидываю нужный кусок в курсор и поехал проверять на NULL и сравнивать переменные. Такое нагромождение получается, глаза бы не глядели...

Может придёт на ум опытным людям элегантное решение?
Спасибо.
PS Только не пинайте мокрым валенком. Я не пижон, я только учусь.
...
Рейтинг: 0 / 0
Анализ 8 дат. Как обойтись без курсора?
    #32042684
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При Delete, наверное ничего проверять не нужно.
Проверки в строке, скорее всего у Вас написаны правильно, а самую-самую последнюю дату подключения/конца ремонта можно получить так (подразумевается, что i все-таки заносится правильно)

Код: plaintext
1.
2.
declare @maxdate datetime
select @maxdate=max(isNULL(remont.p,remont.k)) from remont
where remont.i=inserted.i
...
Рейтинг: 0 / 0
Анализ 8 дат. Как обойтись без курсора?
    #32042693
Фотография AndreK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Cat2
Да, на DEL проверка, в самом деле не нужна, пардон за неточность. Реакция на DEL мне нужна для других целей. Похоже, что без последовательного прохождения курсора не обойтись...
И-э-э-э-ххх... пропадай моя телега, все четыре колеса!
Спасибо.
...
Рейтинг: 0 / 0
Анализ 8 дат. Как обойтись без курсора?
    #32042709
Philippe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
declare @s as datetime, @e as datetime

set @e = '1986-05-19 00:00:00.000'
set @s = '1984-05-19 00:00:00.000'

[color=green] --Если результат 0 - значение допустимое[/color]select count ( * )
 
from dbo.remont r
inner join (
[color=green]	 --Найти минимальное o больше даты конца и максимальное p меньше даты начала[/color]
 
	select distinct ri.i, isnull ( r1.p, '1900-01-01 00:00:00.000' ) p, isnull ( r2.o, '2200-01-01 00:00:00.000' ) o
	from dbo.remont ri
	left outer join (
		select r1.i, max ( r1.p ) p
		from dbo.remont r1
		where r1.p < @s
		group by r1.i
	) r1
	on ri.i = r1.i
	left outer join (
		select r2.i, min ( r2.o ) o
		from dbo.remont r2
		where r2.o > @e
		group by r2.i
	) r2
	on ri.i = r2.i
) ri
on r.i = ri.i and ri.o > r.o and ri.p < r.p


Это для проверки по o и p. Аналогично для n и k. Обе проверки можно объединить в один SQL.
...
Рейтинг: 0 / 0
Анализ 8 дат. Как обойтись без курсора?
    #32042745
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я чего-то не понял, но по моему можно проще. В общем-то это же обычная задача на проверку пересечения диапазонов. А пересекаться они могут если начало одного из диапазонов входит в другой.
Для простоты допустим мы проверяем только начало(n) и конец(k) ремонта. Тогда триггер будет примерно таким:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create trigger tiu_remont on remont for insert, update as
if exists(
  select * from inserted r1, remont r2
  where r1.i=r2.i 
    and ((r1.n<=r2.n and r1.k>=r2.n) or (r2.n<=r1.n and r2.k>=r1.n)) 
    and (проверить по ключу что r1 и r2 - разные записи))
  begin
    print 'Пересечение диапазонов'
    rollback tran
  end

Ну и надо еще учесть null как это сделано у Philippe: null заменяется на заведомо маленькое или заведомо большое число. Я это специально не стал писать что бы было понятней.
...
Рейтинг: 0 / 0
Анализ 8 дат. Как обойтись без курсора?
    #32042748
Фотография AndreK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Philippe
Спасибо
...
Рейтинг: 0 / 0
Анализ 8 дат. Как обойтись без курсора?
    #32042752
Philippe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем-то у меня сделано так потому, что в таблице нет первичного ключа. С ключом можно сделать по-другому. ;)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Анализ 8 дат. Как обойтись без курсора?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]