月份字段是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。
答案 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;