在Oracle中如何从日期中提取年份并转换为数字?

时间:2018-05-11 16:49:54

标签: sql oracle

我需要从4个不同的字段中提取年份,将值转换为数字,然后将这些值与另一个值进行比较。我得到的错误是"不一致的数据类型:预期NUMBER得到DATE"。显然,我将年份改为数字的尝试无效。我的错误在哪里?

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 :(得分:4)

XmR_Plot + stat_QC(method = "XmR", stand.dev = c(2, 3)) 生成一个数字,因此您可以简化:

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

答案 1 :(得分:1)

使用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))
    );