преобразование в формат даты

TVadim
Дата: 04.11.2008 17:20:53
Народ, как можно преобразовать в дату, если у меня имеется отдельно день, месяц и год? Есть ли какие функции? Просто день, месяц и год -это данные которые вычисляются независимо др. от др. и их надо склеить чтобы получить дату.
dmidek
Дата: 04.11.2008 17:24:47
Надо аккуратненько склеить :-)
Возьмем усложненный случай с типом number, с varchar2 еще проще

SQL> select to_date(to_char(4)||'.'||to_char(11)||'.'||to_char(2008),'DD.MM.YYYY') from dual
  2  /
 
TO_DATE(TO_CHAR(4)||'.'||TO_CH
------------------------------
04.11.2008
 
SQL> 
pravednik
Дата: 04.11.2008 17:27:41
SQL> create table x (dd varchar2(5), mm varchar2(10), yyyy varchar2(15));

Table created.

Elapsed: 00:00:00.37
SQL> create table y (y date);

Table created.

Elapsed: 00:00:00.03
SQL> insert into x values ('01', 'MAY', '1984');

1 row created.

Elapsed: 00:00:00.03
SQL> insert into y select to_date(dd||'-'||mm||'-'||yyyy,'DD-MON-YYYY') from x;

1 row created.

SQL> select * from y
  2  /

Y
---------
01-MAY-84

Elapsed: 00:00:00.04
SQL>
TVadim
Дата: 04.11.2008 17:28:22
спасибо, попробую
Windbloom
Дата: 06.01.2009 18:01:19
У меня похожая ситуация, нужно сделать запрос по дате. Причем изначально дата хранится в таблице в нескольких полях: p_33 Number (2) 'число', p_34 Number (2) 'месяц', p_35 Number (4) 'год'
Полагаю, перевод формата данных с помощью функции to_date по представленной выше схеме в данном случае будет подходящим решешением? Поправьте, если не так.
heldir
Дата: 06.01.2009 18:19:16
Windbloom

Полагаю, перевод формата данных с помощью функции to_date по представленной выше схеме в данном случае будет подходящим решешением?


Не совсем. Если по этим полям есть индексы, и эти индексы нужны для ускорения запроса, то приводить к дате - плохая идея. В этом случае лучше ставить условие на каждое поле.
semenar
Дата: 06.01.2009 18:22:58
Windbloom,

у топикастера необходимо преобразовать строковое выражение в дату. Отсюда и to_date.
если вам надо сделать запрос по трем полям как вы указываете
автор
нужно сделать запрос по дате

возможно необходимо использовать extract входящей даты и формировать запрос в соответствии с полями в таблице.
work-sa
Дата: 06.01.2009 18:25:31
Windbloom,
Возможно Вам более подойдет обратное преобразование:
select 
        extract( year  from sysdate) yyyy1,
        extract( Month from sysdate) mm1,
        extract( Day   from sysdate) dd1, -- или
        to_number(to_char(sysdate,'yyyy')) yyyy2,
        to_number(to_char(sysdate,'mm'))   mm2,
        to_number(to_char(sysdate,'dd'))   dd2
    from dual;
Но вариант с extract я сам бы не использовал. Ну не знаю я есть ли какие там особенности.
Может кто подскажет?
Windbloom
Дата: 06.01.2009 18:43:18
да, индексы по этим полям действительно есть. Как отдельно сравнивать поля, не очень понимаю: если, напрмер, надо записи с 01.01.2008 по 05.02.2008 тут возникнут трудности, т.к. в результате такого простого запроса:
select * from usr_usr_tab
where P_33 between 1 and 5 etc
я получу данные с 01.01 05.01 и с 01.02 по 05.02
С экстрактом не знаком, пороюсь в Oracle9i Database Online Documentation.
semenar
Дата: 06.01.2009 18:58:37
Windbloom,

надо получить запрос по дате в периоде? Тогда собирайте дату из полей. и в between её.