powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Да же не знаю как к єтому подойти)))
43 сообщений из 43, показаны все 2 страниц
Да же не знаю как к єтому подойти)))
    #34812537
pavellift
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит когда сегодня в очередной раз не поделили водителей в банке меня пнули и сказали что бы я написал софтинку с расписанием водил. Ничего сложного там небыло, несколько таблиц из которых два справочника ну и собственно таблица с расписанием. в общем работы было на пол часа. Но потом догбавили задание. т.е. смотрите вот расписание водилы № 1 (естественно только нужные столбцы) :

дата |отправка |прибытие |
18.09.2007|8:00 |8:45 |
18.09.2007|9:30 |10:05 |
18.09.2007|11:00 |12:10 |
18.09.2007|13:00 |15:00 |
18.09.2007|18:00 |20:00 |


ну вот расписание до момента икс. потом допустим звоню я и говорю что мне нужен водитель №1 с 14:00 до 14:30 она приспокойненько выбирает время и всё нужные данные жмёт Добавить и вот как сделать что бы ей нельзя было добавить запись ведь водитель катается в промежутке времени
18.09.2007|13:00 |15:00 |
Т.е. отправка и прибытие новой записи не должно находится в промежутке времени уже существующих записией. кто нибудь с таким сталкивался? просто я не знаю как подойти к этому.
заранее спасибо
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34812570
НеПавел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда же тебя, moderated, забанят?
Ты бы хоть читал то, что постишь по всем форумам, Митрофанушка...
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34812695
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитать здесь внимательно
Ещё вопросы по запросу
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34813187
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обычная проверка на непересекающиеся периоды, в триггере или чеконстрейнте проверяйте (new_date_begin between date_begin and date_end) or (new_date_end between date_begin and date_end). Индекс date_begin, date_end.

Отделять дату и время в разные поля -- одно из самых дебильный решений.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34813686
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев ДенисОтделять дату и время в разные поля -- одно из самых дебильный решений.
Ну не надо так жёстко - бывают варианты... :)

Правда в данном случае - тоже лажа (имхо).

Прикольно будет когда водила 23:00 уедет и в 01:30 вернётся...

ну-да, ну-да
варианты типа
18.09.2007|23:00|00:00
19.09.2007|00:00|01:30

А потом проблемы с подсчётом количества выездов, ну и т.д.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34813769
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой Журавлев ДенисОтделять дату и время в разные поля -- одно из самых дебильный решений.
Ну не надо так жёстко - бывают варианты... :)
...Обожаю писать where (date > date_f) or (date=date_f and time >= time_f) или еще круче where year > year_f or year=year_f and month>month_f or year=year_f and month=month_f and day>=day_f .... Вместо одного предиката -- десять, из-за любителей положить год месяц день и время в отдельные поля.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34813986
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис АнатоЛой Журавлев ДенисОтделять дату и время в разные поля -- одно из самых дебильный решений.
Ну не надо так жёстко - бывают варианты... :)
...Обожаю писать where (date > date_f) or (date=date_f and time >= time_f) или еще круче where year > year_f or year=year_f and month>month_f or year=year_f and month=month_f and day>=day_f .... Вместо одного предиката -- десять, из-за любителей положить год месяц день и время в отдельные поля.

Да я понимаю...
Я не совсем про это.
Я про то, что иногда бывает необходимость выделить время или дату из DATETIME в отдельное поле для создания индекса по нему ("в ущерб" нормальной форме)...
Ну неудобно иногда часто использовать
Код: plaintext
1.
2.
SELECT * FROM tmp_dtm_test
WHERE dtm_test BETWEEN '2007-09-20 00:00:00' AND '2007-09-20 23:59:59';
вместо того, чтобы писать
Код: plaintext
1.
2.
SELECT * FROM tmp_dtm_test
WHERE DATE(dtm_test) = TODAY;

Почему? Выкладки - ниже:

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
CREATE TABLE "informix".tmp_dtm_test(
   dtm_test DATETIME YEAR to SECOND NOT NULL
);

SET ISOLATION TO DIRTY READ;

INSERT INTO tmp_dtm_test(dtm_test)
  SELECT DBINFO('utc_to_datetime', connected) FROM sysmaster:syssessions;

INSERT INTO tmp_dtm_test(dtm_test)
  SELECT (dtm_test) - ( 1  UNITS DAY) FROM tmp_dtm_test;

INSERT INTO tmp_dtm_test(dtm_test)
  SELECT (dtm_test) - ( 2  UNITS DAY) FROM tmp_dtm_test;

INSERT INTO tmp_dtm_test(dtm_test)
  SELECT (dtm_test) - ( 3  UNITS DAY) FROM tmp_dtm_test;

INSERT INTO tmp_dtm_test(dtm_test)
  SELECT (dtm_test) - ( 4  UNITS DAY) FROM tmp_dtm_test;

CREATE INDEX "informix".i_tmp_dtm_test ON "informix".tmp_dtm_test(dtm_test);

UPDATE STATISTICS LOW FOR TABLE tmp_dtm_test;

QUERY:
------
select {+ EXPLAIN} * FROM tmp_dtm_test
WHERE DATE(dtm_test) = TODAY;

DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost:  3 
Estimated # of Rows Returned:  8 

   1 ) informix.tmp_dtm_test: SEQUENTIAL SCAN

        Filters: DATE (informix.tmp_dtm_test.dtm_test ) = TODAY


QUERY:
------
select {+ EXPLAIN} * FROM tmp_dtm_test
WHERE dtm_test BETWEEN '2007-09-20 00:00:00' AND '2007-09-20 23:59:59';

DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost:  1 
Estimated # of Rows Returned:  9 

   1 ) informix.tmp_dtm_test: INDEX PATH

    ( 1 ) Index Keys: dtm_test   (Key-Only)  (Serial, fragments: ALL)
        Lower Index Filter: informix.tmp_dtm_test.dtm_test >= datetime( 2007 - 09 - 20   00 : 00 : 00 ) year to second

        Upper Index Filter: informix.tmp_dtm_test.dtm_test <= datetime( 2007 - 09 - 20   23 : 59 : 59 ) year to second
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34814104
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой
Код: plaintext
1.
2.
SELECT * FROM tmp_dtm_test
WHERE dtm_test BETWEEN '2007-09-20 00:00:00' AND '2007-09-20 23:59:59';
Ну, на вкус и цвет все фломастеры разные.

Функциональный индекс можно попробовать DATE(dtm_test)
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34814182
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис
Функциональный индекс можно попробовать DATE(dtm_test)


Начиная с какой версии IDS?! :( :)
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34814377
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой Журавлев ДенисФункциональный индекс можно попробовать DATE(dtm_test)
Начиная с какой версии IDS?! :( :)Любая 9-ка.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34814453
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
29.
30.
31.
32.
33.
create function _date(v datetime year to second) returning date with (not variant)
return date(v);
end function;

CREATE INDEX i_tmp_dtm_test ON tmp_dtm_test(_DATE(dtm_test));

UPDATE STATISTICS LOW FOR TABLE tmp_dtm_test;

QUERY:
------
select {+ EXPLAIN} * FROM tmp_dtm_test
WHERE _DATE(dtm_test) = TODAY

DIRECTIVES FOLLOWED: 
EXPLAIN 
DIRECTIVES NOT FOLLOWED: 

Estimated Cost: 1
Estimated # of Rows Returned: 2

  1) informix.tmp_dtm_test: INDEX PATH

    (1) Index Keys: informix._date(dtm_test)   (Serial, fragments: ALL)
        (fragments might be eliminated at runtime because filter contains 
runtime constants)
        Lower Index Filter: informix._date(informix.tmp_dtm_test.dtm_test )= TODAY 

UDRs in query:
--------------
    UDR id  :   254
    UDR name:   _date
    UDR id  :   254
    UDR name:   _date
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34814788
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой
Почему? Выкладки - ниже:
1) informix.tmp_dtm_test: SEQUENTIAL SCAN
Filters: DATE (informix.tmp_dtm_test.dtm_test ) = TODAY
....
1) informix.tmp_dtm_test: INDEX PATH
(1) Index Keys: dtm_test (Key-Only) (Serial, fragments: ALL)
Lower Index Filter: informix.tmp_dtm_test.dtm_test >= datetime(2007-09-20 00:00:00) year to second
Upper Index Filter: informix.tmp_dtm_test.dtm_test <= datetime(2007-09-20 23:59:59) year to second
Ну и что тут особенного ? Что ты хотел показать ?
В первом случае скан , возможно, используется только потому, что таблица маленькая и по индексу читать дороже. Или ты хочешь сказать, что индекс здесь вообще не будет использоваться ни при каких условиях ?
Во втором случае используется Key-Only, но вряд ли в реальном запросе тебе кроме времени больше ничего не надо будет тащить из таблицы.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34814898
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilisИли ты хочешь сказать, что индекс здесь вообще не будет использоваться ни при каких условиях ?
именно так.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34814934
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис vasilisИли ты хочешь сказать, что индекс здесь вообще не будет использоваться ни при каких условиях ?
именно так.
Это баг или фича ? Если последнее, то где это написано или откуда известно ?
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34814961
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilisЭто баг или фича ? Если последнее, то где это написано или откуда известно ?Это аксиома, для любых субд.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34815432
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DATETIME далеко не у всех есть.
Или это не связано с типом ?
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34815453
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilisDATETIME далеко не у всех есть.
Или это не связано с типом ?
не связано.

where interger_f - 1 = 0 -- индекс по полю interger_f использоваться не будет

where interger_f = 0 + 1 -- индекс по полю interger_f использоваться будет
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34815635
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис vasilisDATETIME далеко не у всех есть.
Или это не связано с типом ?
не связано.
where interger_f - 1 = 0 -- индекс по полю interger_f использоваться не будет
where interger_f = 0 + 1 -- индекс по полю interger_f использоваться будет
Это то понятно. Мы просто говорили о разных вещах (по моей вине).
Я только сейчас увидел в том примере WHERE DATE (dtm_test) =
т.е. использование функции.
Конечно же, стандартный индекс тут ни при чем :)
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34816448
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilisЭто то понятно. Мы просто говорили о разных вещах (по моей вине).
Я только сейчас увидел в том примере WHERE DATE (dtm_test) =
т.е. использование функции.
Конечно же, стандартный индекс тут ни при чем :)Ну слава богу, дошло. А я подумал что у тебя склероз уже начался :)
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34817249
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Денис ..проверяйте (new_date_begin between date_begin and date_end) or (new_date_end between date_begin and date_end)..
на мой взгляд забыли еще об одном условии, должно быть так
(new_date_begin between date_begin and date_end) or (new_date_end between date_begin and date_end)
or (date_begin between new_date_begin and new_date_end) or (date_end between new_date_begin and new_date_end)
Если не прав - поправьте )
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34817323
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_на мой взгляд забыли еще об одном условии, должно быть так
(new_date_begin between date_begin and date_end) or (new_date_end between date_begin and date_end)
or (date_begin between new_date_begin and new_date_end) or (date_end between new_date_begin and new_date_end)
Если не прав - поправьте )Да, забыл. Предлагаю так:

(new_date_begin between date_begin and date_end) or (new_date_end between date_begin and date_end)
or (new_date_begin < date_begin and new_date_end > date_end)

Тут еще правда надо думать о null и о том чтобы new_date_begin>new_date_end
Т.е. я всегда предлагаю вместо null 01.01.0001 и 31.12.9999
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34822545
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понял, что скоро и мне надо будет это проверять, решил вернутся :)
В этом предположении:
Журавлев Денис
Тут еще правда надо думать о null и о том чтобы new_date_begin>new_date_end
Т.е. я всегда предлагаю вместо null 01.01.0001 и 31.12.9999


Журавлев ДенисДа, забыл. Предлагаю так:
(new_date_begin between date_begin and date_end) or (new_date_end between date_begin and date_end)
or (new_date_begin < date_begin and new_date_end > date_end)


все таки видимо так:
((new_date_begin >= date_begin) and (new_date_begin < date_end))
or ((new_date_end > date_begin) and (new_date_end <=date_end)
or ((date_begin >= new_date_begin) and (date_begin < new_date_end))
or ((date_end > new_date_begin) and (date_end <=new_date_end)

начал путаться.. поправте
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34823097
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_начал путаться.. поправтеСделайте контрольный пример, на нем будем проверять.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34825845
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис vasilisЭто то понятно. Мы просто говорили о разных вещах (по моей вине).
Я только сейчас увидел в том примере WHERE DATE (dtm_test) =
т.е. использование функции.
Конечно же, стандартный индекс тут ни при чем :)Ну слава богу, дошло. А я подумал что у тебя склероз уже начался :)
Склероз все равно начался :), но в данном случае он ни при чем, это была просто невнимательность.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34831062
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев ДенисСделайте контрольный пример, на нем будем проверять.
Перед созданием примера, хотелось бы уточнить след:
Многоверсионных СУБД (например IB) проверять, например на уникальность, мягко говоря, не рекомендуется. В Informix'e, видимо благодаря блокировке можно. Так ли это?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 
CREATE TABLE test_d(
   id_test_tr SERIAL NOT NULL,
   id_user INTEGER NOT NULL,
   start_date DATE NOT NULL,
   end_date DATE NOT NULL
)   ;
ALTER TABLE test_d ADD CONSTRAINT  check  (start_date <  end_date) ;


Как написать в чекконстраинте, например условие: (new_date_begin between date_begin and date_end)
не знаю. В документации не нашел. Видимо плохо искал (. Подскажите как?
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34831308
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_Многоверсионных СУБД (например IB) проверять, например на уникальность, мягко говоря, не рекомендуется. В Informix'e, видимо благодаря блокировке можно. Так ли это?В версионниках надо отдельно извращаться, т.к. две одновременных транзакции не видят данных друг друга, то проверка просто не сработает, и в бд будут неконстистентные данные (пересекающиеся периоды).
В блокировочнике попроще "опоздавшая" транзакция "зависнет" и проверит уже закомиченное.

Gold_Как написать в чекконстраинте, например условие: (new_date_begin between date_begin and date_end)
не знаю. В документации не нашел. Видимо плохо искал (. Подскажите как?Никак. Я когда ранее писал про check думал про вариант проверки самосоединением таблицы, но этот вариант во первых медленнее, во вторых информикс не позволяет делать селект из check констрейнта (я ошибочно думал что позволяет). Триггером надо проверять.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34831430
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Денис ..Триггером надо проверять.
Еще вопросик: если записи в эту таблицу заносятся через процедуру. и я уверен, что будут заносится только с использованием этой процедуры, то корректна ли проверка будет в процедуре?
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34831928
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_ Журавлев Денис ..Триггером надо проверять.
Еще вопросик: если записи в эту таблицу заносятся через процедуру. и я уверен, что будут заносится только с использованием этой процедуры, то корректна ли проверка будет в процедуре?
Если в процедуре сделать сначала insert/update, а потом проверить а не противоречат-ли другие записи, то наверно получится.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34832458
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Денис Gold_ Журавлев Денис ..Триггером надо проверять.
Еще вопросик: если записи в эту таблицу заносятся через процедуру. и я уверен, что будут заносится только с использованием этой процедуры, то корректна ли проверка будет в процедуре?
Если в процедуре сделать сначала insert/update, а потом проверить а не противоречат-ли другие записи, то наверно получится.
Ага... и если противоречит откатываю транзакцию.
А если наоборот (как я хотел), то между проверкой и insert/update может быть другой insert/update
Так?
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34833324
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_Ага... и если противоречит откатываю транзакцию.Да.
Gold_А если наоборот (как я хотел), то между проверкой и insert/update может быть другой insert/update
Так?Именно.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34835744
vkubr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев ДенисДа, забыл. Предлагаю так:
(new_date_begin between date_begin and date_end) or (new_date_end between date_begin and date_end)
or (new_date_begin < date_begin and new_date_end > date_end)


все таки видимо так:
((new_date_begin >= date_begin) and (new_date_begin < date_end))
or ((new_date_end > date_begin) and (new_date_end <=date_end)
or ((date_begin >= new_date_begin) and (date_begin < new_date_end))
or ((date_end > new_date_begin) and (date_end <=new_date_end)

начал путаться.. поправте

Перемудрили.

Для условия пересечения интервалоа достаточно написать так (учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999):

new_date_begin <= date_end AND new_date_end >= date_begin

Условие непересечения интервалов:

new_date_begin > date_end OR new_date_end < date_begin
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34836068
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkubr
Для условия пересечения интервалоа достаточно написать так ( учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999 ):

new_date_begin <= date_end AND new_date_end >= date_begin

Условие непересечения интервалов:

new_date_begin > date_end OR new_date_end < date_begin



тогда недостаточно ограничения на входные параметры по отсутствию NULL
необходимо ЕЩЁ одно ограничение на входные параметры:

Код: plaintext
new_date_begin >= new_date_end
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34836072
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой
сорри, конечно же
new_date_begin <= new_date_end
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34836074
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, конечно же
new_date_begin <= new_date_end


П.С.: срочно спать!
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34836236
vkubr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатоЛой
тогда недостаточно ограничения на входные параметры по отсутствию NULL
необходимо ЕЩЁ одно ограничение на входные параметры:
Код: plaintext
new_date_begin >= new_date_end

Разумеется, это подразумевалось.

Условие (beg <= end) реализуется отдельно через check constraint.

Т.о. в условие пересечения/непересечения интервалов (реализуется через триггер)
его можно не включать.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34837980
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkubr[quot ]
....

Перемудрили.

Для условия пересечения интервалоа достаточно написать так (учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999):

new_date_begin <= date_end AND new_date_end >= date_begin

Условие непересечения интервалов:

new_date_begin > date_end OR new_date_end < date_begin
Переупростил )
Например, "новый интервал" вписывается между "старыми"..
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838159
vkubr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gold_ vkubr[quot ]
....

Перемудрили.

Для условия пересечения интервалов достаточно написать так (учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999):

new_date_begin <= date_end AND new_date_end >= date_begin

Условие непересечения интервалов:

new_date_begin > date_end OR new_date_end < date_begin
Переупростил )
Например, "новый интервал" вписывается между "старыми"..

Что значит "новый интервал" вписывается между "старыми" ? Причем тут попарное непересечение интервалов? Может мы о разных вещах говорим?

Указанные условия пересечения (непересечения) интервалов предназначены для использования в ситуации, когда есть таблица, реализующая т.н. "интервальную" историю и требуется обеспечить попарное непересечение интервалов.

Предположим, что интервал задается парой колонок date_beg и date_end:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE History(
...
  date_beg DATE NOT NULL,
  date_end DATE NOT NULL,
...
  CHECK( date_beg<=date_end ),   // Гаранируем корректность интервала.
...
);
Если требуется, то для обозначения "минус-бесконечности" и "плюс-бесконечности" используем, соответственно, 01.01.0001 и 31.12.9999.

Теперь остается обеспечить, чтобы все интервалы попарно не пересекались.

Для этого создаем INSERT/UPDATE-триггеры, в которых для вставляемой/редактируемой записи проверяем, что для вновь устанавливаемых значений new.date_beg и new.date_end в таблице не существует других интервалов, пересекающихся с устанавливаемым.

То есть в триггере пытаемся найти пересекающийся интервал, и если таковой обнаруживается, то делаем EXCEPTION.
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TRIGGER History_i
     INSERT ON History REFERENCING NEW new FOR EACH ROW
  WHEN( ( SELECT COUNT(*) 
            FROM History
           WHERE new.date_beg <= History.date_end AND 
                 new.date_end >= History.date_beg ) >  1  )
  ( RAISE EXCEPTION - 746  ) );

Аналогично - для UPDATE.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838432
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkubrВы проверяйте что-ли то что пишете. С таким триггером вообще в таблицу ничего не вставить.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select * from test_d  
start_date end_date 
 01 . 01 . 07     01 . 02 . 07 

select count(*) from test_d where '01.01.2007'<=start_date and '01.02.2007'>=end_date
      (count(*)) 
                1 

И вообще
Код: plaintext
1.
2.
select count(*) from test_d where '01.01.2006'<=start_date and '15.01.2007'>=end_date "| dbaccess a
      (count(*)) 
                0 
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838455
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, это я даты наоборот поставил.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838514
vkubr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Денис vkubrВы проверяйте что-ли то что пишете. С таким триггером вообще в таблицу ничего не вставить.
А Вы попробуйте. Только с тем запросом, который в триггере, а не с тем, который в Вашем посте (у Вас совсем другое условие).

Условие (SELECT COUNT(*) ... ) > 1 (а не " > 0 ", как можно было бы подумать) учитывает, что в выборку попадет и сам вставляемый интервал, т.к. интервал всегда пересекается с самим собой.

Конечно, если делать реализацию не через триггер, а через процедуру, используемую вместо INSERT/UPDATE и выполняющую проверку до вставки/редактирования, то условие должно быть " > 0 ").

Но делать через триггер -- надежнее.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838613
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkubr


Вы правы.
Спасибо.
Я кроме прочих неточностей еще и предполагал, что например периоды
2007-10-10 12:00:00 - 2007-10-10 13:00:00
и
2007-10-10 13:00:00 - 2007-10-10 14:00:00
не пересекаются...
Пользователю, так удобно видеть..
надо бы решить принципиально что у меня включено в период, а что исключено
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838670
vkubr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gold_
Я кроме прочих неточностей еще и предполагал, что например периоды
2007-10-10 12:00:00 - 2007-10-10 13:00:00
и
2007-10-10 13:00:00 - 2007-10-10 14:00:00
не пересекаются...
Пользователю, так удобно видеть..
надо бы решить принципиально что у меня включено в период, а что исключено
В этом случае нужно просто договориться, что правая граница интервала в него не входит и соответствующим образом скорректировать условия: в условии пересечения интервалов поменять нестрогие сравнения ( >= и <= ) на строгие ( > и < ), а в условии непересечения -- наоборот.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838706
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkubr
Условие (SELECT COUNT(*) ... ) > 1 (а не " > 0 ", как можно было бы подумать) учитывает, что в выборку попадет и сам вставляемый интервал, т.к. интервал всегда пересекается с самим собой.Да, уже сообразил.


vkubrКонечно, если делать реализацию не через триггер, а через процедуру, используемую вместо INSERT/UPDATE и выполняющую проверку до вставки/редактирования, то условие должно быть " > 0 ").До вставки/редактирования как раз проверять нельзя, одновременно навставляют из разных транзакций.

vkubrНо делать через триггер -- надежнее.Без разницы, если правильно все сделать.
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / Informix [игнор отключен] [закрыт для гостей] / Да же не знаю как к єтому подойти)))
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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