powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Да же не знаю как к єтому подойти)))
25 сообщений из 43, страница 1 из 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
25 сообщений из 43, страница 1 из 2
Форумы / Informix [игнор отключен] [закрыт для гостей] / Да же не знаю как к єтому подойти)))
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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