Как создать индекс, который бы действовал на: TO_CHAR(open_dt,'YYYY') =

Yura Zavaliy
Дата: 23.09.2004 15:27:40
Есть много запросов, в которых часто встречается выражение:
and TO_CHAR(open_dt,'YYYY') = TO_CHAR(to_date(A,'DD/MM/YYYY'),'YYYY')
and TO_CHAR(open_dt,'MM') = TO_CHAR(to_date(A,'DD/MM/YYYY'),'MM');

как бы создать индекс который ускорил выполнение? простого
CREATE INDEX OPEN_DT ON CIF_MONTH22
( OPEN_DT ASC )
хватит?
и как проверить используется ли индекс созданный?
Спасиб.......
Barkovsky
Дата: 23.09.2004 15:39:30
хватит, если дать по шее тем, кто так пишет и написать запросы нормально:

and open_dt >= trunc(to_date(A,'DD/MM/YYYY'),'MM')
and open_dt < trunc(last_day(to_date(A,'DD/MM/YYYY'))+1,'MM')
Shab
Дата: 23.09.2004 16:11:12
Т.к сравниваются по сути, как я понял, в одном ли месяце или годе две даты,
то должно быть не open_dt а trunc(open_dt,'MM')

Может быть сделать индекс по функции?
Stax
Дата: 23.09.2004 16:47:41
А ешо мона :(
and open_dt >= trunc(to_date(A,'DD/MM/YYYY'),'MM')
and open_dt < add_months(trunc(to_date(A,'DD/MM/YYYY'),'MM'),1)
Barkovsky
Дата: 23.09.2004 17:15:15
а я сомневался, что февраль нормально отработает.
но оракл умный и в доке об этом описано:)

дока
ADD_MONTHS ( d , n )
Purpose Returns the date d plus n months. The argument n can be any integer. If d
is the last day of the month or if the resulting month has fewer days than
the day component of d, then the result is the last day of the resulting
month. Otherwise, the result has the same day component as d.


Connected to Oracle9i Enterprise Edition Release 9.2.0.4.0 
Connected as main

[SRC oracle]SQL> select add_months(to_date('29012004','DDMMYYYY'),1) from dual
  2  /

ADD_MONTHS(TO_DATE('29012004',
------------------------------
29.02.2004

SQL> select add_months(to_date('30012004','DDMMYYYY'),1) from dual
  2  /

ADD_MONTHS(TO_DATE('30012004',
------------------------------
29.02.2004

SQL> select add_months(to_date('31012004','DDMMYYYY'),1) from dual
  2  /

ADD_MONTHS(TO_DATE('31012004',
------------------------------
29.02.2004

SQL> 
Stax
Дата: 23.09.2004 18:47:27
C первым числом ведь работаем,
так что все ок

Для статистики с февралем

SQL> select add_months(to_date('29022004','DDMMYYYY'),1) from dual;

ADD_MONT
--------
31.03.04

SQL> select add_months(to_date('28022004','DDMMYYYY'),1) from dual;

ADD_MONT
--------
28.03.04