Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / Да же не знаю как к єтому подойти))) / 25 сообщений из 43, страница 1 из 2
19.09.2007, 19:08
    #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
19.09.2007, 19:31
    #34812570
НеПавел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
Когда же тебя, moderated, забанят?
Ты бы хоть читал то, что постишь по всем форумам, Митрофанушка...
...
Рейтинг: 0 / 0
19.09.2007, 20:48
    #34812695
vasilis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
Прочитать здесь внимательно
Ещё вопросы по запросу
...
Рейтинг: 0 / 0
20.09.2007, 08:42
    #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
20.09.2007, 11:20
    #34813686
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
Журавлев ДенисОтделять дату и время в разные поля -- одно из самых дебильный решений.
Ну не надо так жёстко - бывают варианты... :)

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

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

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

А потом проблемы с подсчётом количества выездов, ну и т.д.
...
Рейтинг: 0 / 0
20.09.2007, 11:39
    #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
20.09.2007, 12:23
    #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
20.09.2007, 12:50
    #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
20.09.2007, 13:08
    #34814182
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
Журавлев Денис
Функциональный индекс можно попробовать DATE(dtm_test)


Начиная с какой версии IDS?! :( :)
...
Рейтинг: 0 / 0
20.09.2007, 13:46
    #34814377
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
АнатоЛой Журавлев ДенисФункциональный индекс можно попробовать DATE(dtm_test)
Начиная с какой версии IDS?! :( :)Любая 9-ка.
...
Рейтинг: 0 / 0
20.09.2007, 14:00
    #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
20.09.2007, 15:09
    #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
20.09.2007, 15:32
    #34814898
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
vasilisИли ты хочешь сказать, что индекс здесь вообще не будет использоваться ни при каких условиях ?
именно так.
...
Рейтинг: 0 / 0
20.09.2007, 15:39
    #34814934
vasilis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
Журавлев Денис vasilisИли ты хочешь сказать, что индекс здесь вообще не будет использоваться ни при каких условиях ?
именно так.
Это баг или фича ? Если последнее, то где это написано или откуда известно ?
...
Рейтинг: 0 / 0
20.09.2007, 15:45
    #34814961
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
vasilisЭто баг или фича ? Если последнее, то где это написано или откуда известно ?Это аксиома, для любых субд.
...
Рейтинг: 0 / 0
20.09.2007, 17:24
    #34815432
vasilis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
DATETIME далеко не у всех есть.
Или это не связано с типом ?
...
Рейтинг: 0 / 0
20.09.2007, 17:28
    #34815453
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
vasilisDATETIME далеко не у всех есть.
Или это не связано с типом ?
не связано.

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

where interger_f = 0 + 1 -- индекс по полю interger_f использоваться будет
...
Рейтинг: 0 / 0
20.09.2007, 18:07
    #34815635
vasilis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
Журавлев Денис vasilisDATETIME далеко не у всех есть.
Или это не связано с типом ?
не связано.
where interger_f - 1 = 0 -- индекс по полю interger_f использоваться не будет
where interger_f = 0 + 1 -- индекс по полю interger_f использоваться будет
Это то понятно. Мы просто говорили о разных вещах (по моей вине).
Я только сейчас увидел в том примере WHERE DATE (dtm_test) =
т.е. использование функции.
Конечно же, стандартный индекс тут ни при чем :)
...
Рейтинг: 0 / 0
21.09.2007, 08:42
    #34816448
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
vasilisЭто то понятно. Мы просто говорили о разных вещах (по моей вине).
Я только сейчас увидел в том примере WHERE DATE (dtm_test) =
т.е. использование функции.
Конечно же, стандартный индекс тут ни при чем :)Ну слава богу, дошло. А я подумал что у тебя склероз уже начался :)
...
Рейтинг: 0 / 0
21.09.2007, 12:08
    #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
21.09.2007, 12:29
    #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
24.09.2007, 18:53
    #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
25.09.2007, 08:32
    #34823097
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
Gold_начал путаться.. поправтеСделайте контрольный пример, на нем будем проверять.
...
Рейтинг: 0 / 0
25.09.2007, 20:11
    #34825845
vasilis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Да же не знаю как к єтому подойти)))
Журавлев Денис vasilisЭто то понятно. Мы просто говорили о разных вещах (по моей вине).
Я только сейчас увидел в том примере WHERE DATE (dtm_test) =
т.е. использование функции.
Конечно же, стандартный индекс тут ни при чем :)Ну слава богу, дошло. А я подумал что у тебя склероз уже начался :)
Склероз все равно начался :), но в данном случае он ни при чем, это была просто невнимательность.
...
Рейтинг: 0 / 0
27.09.2007, 13:32
    #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
Форумы / Informix [игнор отключен] [закрыт для гостей] / Да же не знаю как к єтому подойти))) / 25 сообщений из 43, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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