Oracle SQL从6位数字NUMBER获取上个月

时间:2015-02-25 20:59:09

标签: sql oracle

月份字段是NUMBER形式的YYYYMM。 我想上个月。如果当前月份是1月,我已计算上个月到12月例如:201301转换为201212.(如果最后两位数被评估为1,我使用MOD检查最后一次,如果是,则减去年份并将12作为月份追加)

如果当月是除1月以外的任何月份,我试图获得上个月。为此我试过 -

  1) select  CONCAT( SUBSTR(201405,1,4),  MOD(201405,100) - 1 )  from dual;
  2) select  CONCAT( SUBSTR(201405,1,4),  SUBSTR(201405,5,6) - 1 )  from dual;

在两种情况下它都返回20144,即它从当前月份下降0。因此,对于201405的值,它应该返回201404。

2 个答案:

答案 0 :(得分:2)

试试这个:

SELECT TO_NUMBER(TO_CHAR(ADD_MONTHS(TO_DATE(DAT,'YYYYMM'),-1),'YYYYMM')) PREV_MONTH 
FROM 
(SELECT 201405 DAT FROM DUAL);

输出:

PREV_MONTH
----------
    201404
1 row selected.

答案 1 :(得分:1)

你可以使用INTERVAL(当然整件事不符合ANSI标准,因此引入ANSI间隔可能很愚蠢,但仍然如此):

SELECT TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(201405), 'YYYYMM') - INTERVAL '1' MONTH, 'YYYYMM'))
  FROM dual;

你实际上可以省略对TO_CHAR()的内部调用,只是让Oracle进行隐式转换(不确定我是否同意):

SELECT TO_NUMBER(TO_CHAR(TO_DATE(201405, 'YYYYMM') - INTERVAL '1' MONTH, 'YYYYMM'))
  FROM dual;

或者你可以试试这个:

WITH d1 AS (
    SELECT TO_DATE(TO_CHAR(201405), 'YYYYMM') - INTERVAL '1' MONTH AS new_date
      FROM dual
)
SELECT EXTRACT(YEAR FROM new_date) * 100 + EXTRACT(MONTH FROM new_date)
  FROM d1;