В Oracle, как извлечь год от даты и преобразовать в число? - PullRequest
0 голосов
/ 11 мая 2018

Мне нужно извлечь год из 4 различных полей, преобразовать значения в числа, а затем сравнить эти значения с другим значением. Я получаю сообщение об ошибке «Несоответствующие типы данных: ожидаемое число получило дату». Очевидно, что моя попытка изменить год на число не работает. Где моя ошибка?

select  pc.a00_pnum
    ,pc.a06_edition
    ,pu.c26_year_built
    ,TO_NUMBER(EXTRACT(year FROM pu.C38_UPDT_HEAT)) "yr_ht_updtd"
    ,TO_NUMBER(EXTRACT(year FROM pu.C35_UPDT_PLUMB)) "yr_plumb_updtd"
    ,TO_NUMBER(EXTRACT(year FROM pu.C34_UPDT_WIRE)) "yr_wire_updtd"
    ,TO_NUMBER(EXTRACT(year FROM pu.C22_UPDT_ROOF)) "yr_roof_updtd"
    from tfprpt.pcommon pc
    join tfprpt.punit pu
    on pc.a00_pnum = pu.a00_pnum
    and pc.a06_edition = pu.a06_edition
    where pc.a06_edition = (select max(pc2.a06_edition) from tfprpt.pcommon pc2 where pc2.a00_pnum = pc.a00_pnum) and
    pc.a09_xdate >= '11-May-18' and
    pc.d14_status = 'I' and
    (
        pu.c26_year_built > pu.C38_UPDT_HEAT or 
        pu.c26_year_built > pu.C35_UPDT_PLUMB or 
        pu.c26_year_built > pu.C34_UPDT_WIRE or 
        pu.c26_year_built > pu.C22_UPDT_ROOF
    );

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

extract() создает число, поэтому вы можете упростить:

TO_NUMBER(EXTRACT(year FROM pu.C38_UPDT_HEAT)) "yr_ht_updtd"

до:

EXTRACT(year FROM pu.C38_UPDT_HEAT) as "yr_ht_updtd"

Я не знаю, какой тип данных pu.c26_year_built.Если это число, то повторите выписку:

    pu.c26_year_built > extract(year from pu.C38_UPDT_HEAT) or 
    pu.c26_year_built > extract(year from pu.C35_UPDT_PLUMB) or 
    pu.c26_year_built > extract(year from pu.C34_UPDT_WIRE) or 
    pu.c26_year_built > extract(year from pu.C22_UPDT_ROOF)
0 голосов
/ 11 мая 2018

Использование extract для изменения того, что отображается в операторе select, отличается от того, что вы указали в предложении where.Вам просто нужно сделать то же самое в предложении where.

select  pc.a00_pnum
    ,pc.a06_edition
    ,pu.c26_year_built
    ,TO_NUMBER(EXTRACT(year FROM pu.C38_UPDT_HEAT)) "yr_ht_updtd"
    ,TO_NUMBER(EXTRACT(year FROM pu.C35_UPDT_PLUMB)) "yr_plumb_updtd"
    ,TO_NUMBER(EXTRACT(year FROM pu.C34_UPDT_WIRE)) "yr_wire_updtd"
    ,TO_NUMBER(EXTRACT(year FROM pu.C22_UPDT_ROOF)) "yr_roof_updtd"
    from tfprpt.pcommon pc
    join tfprpt.punit pu
    on pc.a00_pnum = pu.a00_pnum
    and pc.a06_edition = pu.a06_edition
    where pc.a06_edition = (select max(pc2.a06_edition) from tfprpt.pcommon pc2 where pc2.a00_pnum = pc.a00_pnum) and
    pc.a09_xdate >= '11-May-18' and
    pc.d14_status = 'I' and
    (
        pu.c26_year_built > TO_NUMBER(EXTRACT(year FROM pu.C38_UPDT_HEAT)) or 
        pu.c26_year_built > TO_NUMBER(EXTRACT(year FROM pu.C35_UPDT_PLUMB)) or 
        pu.c26_year_built > TO_NUMBER(EXTRACT(year FROM pu.C34_UPDT_WIRE)) or 
        pu.c26_year_built > TO_NUMBER(EXTRACT(year FROM pu.C22_UPDT_ROOF))
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...