在何时使用案例操纵数据

时间:2015-03-26 05:48:10

标签: sql oracle date-manipulation

我在SQL Oracle中遇到日期操作问题。这是一些代码。假设我有3列

Create table anom1(
NAMEID, VARCHAR(20),
DATE_ENTRY, VARCHAR(20),
BIRTH DATE
)

这里是nameid,date_entry和birth

的值
INSERT INTO ANOM1(NAMEID,DATE_ENTRY,BIRTH) VALUES('3404077803080028','12-03-2008',TO_DATE('26-07-1987','DD-MM-YYYY'));
INSERT INTO ANOM1(NAMEID,DATE_ENTRY,BIRTH) VALUES('3404012303080028','01-01-2098',TO_DATE('26-07-2014','DD-MM-YYYY'));
INSERT INTO ANOM1(NAMEID,DATE_ENTRY,BIRTH) VALUES('3404013303080028','01-01-2008',TO_DATE('26-07-2013','DD-MM-YYYY'));
INSERT INTO ANOM1(NAMEID,DATE_ENTRY,BIRTH) VALUES('3404012303080028','01-01-2098',TO_DATE('26-07-1999','DD-MM-YYYY'));

我有3个案例,

  1. 我想操纵date_entry<的日期出生,更改date_entry从出生开始替换年份+1
  2. 之后我想操纵date_entry> sysdate,将date_entry更改为2010年
  3. 条件if date_entry> sysdate和birth< 5(1 - 4年) 像麻木1一样的条件
  4. 实施例

    案例1

    date_entry < birth
    01-01-2008  26-03-2015
    

    案例2

    Date_entry > sysdate
    01-01-2098  26-03-2015
    

    案例3

    Date_entry > sysdate and birth < year 
    26-07-2014  01-01-2098  (01-01-2010) date_entry_dummy
    

    我的工作:

    SELECT NAMEID,BIRTH,DATE_ENTRY,
    CASE WHEN DATE_ENTRY < BIRTH THEN
    REPLACE(DATE_ENTRY,SUBSTR(DATE_ENTRY,7,4),(EXTRACT(YEAR FROM BIRTH)+1))
    WHEN DATE_ENTRY > SYSDATE THEN
    REPLACE(DATE_ENTRY,SUBSTR(DATE_ENTRY,7,4),2010)
    WHEN DATE_ENTRY > SYSDATE AND TRUNC(FLOOR(MONTHS_BETWEEN(SYSDATE,BIRTH)/12))< 5 THEN
    REPLACE(DATE_ENTRY,SUBSTR(DATE_ENTRY,7,4),(EXTRACT(YEAR FROM BIRTH)+1))
    ELSE DATE_ENTRY
    END DATE_ENTRY_DUMMY FROM ANOM1;
    

    这是失败的结果:

    NAMEID              | BIRTH     | DATE ENTRY | DATE_ENTRY DUMMY
    3404077803080028     26-07-1987   12-03-2008       12-03-2008
    3404012303080028     26-07-2014   01-01-2098       01-01-2010
    3404013303080028     26-07-2013   01-01-2008       01-01-2014
    3404012303080028     26-07-1999   01-01-2098       01-01-2010
    

    如何使这一年如此:

    NAMEID              | BIRTH     | DATE ENTRY | DATE_ENTRY DUMMY
    3404077803080028     26-07-1987   12-03-2008       12-03-2008
    3404012303080028     26-07-2014   01-01-2098       01-01-2015
    3404013303080028     26-07-2013   01-01-2008       01-01-2014
    3404012303080028     26-07-1999   01-01-2098       01-01-2010
    

    在条件SQL的情况下需要建议。

1 个答案:

答案 0 :(得分:1)

在CASE语句中,按顺序计算每个when子句,直到找到匹配项。所以在你的情况下     WHEN DATE_ENTRY > SYSDATE 将永远匹配之前     WHEN DATE_ENTRY > SYSDATE AND TRUNC(FLOOR(MONTHS_BETWEEN(SYSDATE,BIRTH)/12))< 5 被评估。

如果您订购的if子句从更具体到更不具体,您将获得您想要的结果。

作为旁注,请注意隐式转换。您应该将date_entry字段转换为日期,或者具有不同NLS设置的客户端可能会得到不同的结果。

因此请使用TO_DATE(DATE_ENTRY,'dd-mm-yyyy') > SYSDATE