[英]Oracle SQL Get previous month from 6 digit number NUMBER
月份字段為YYYYMM(數字形式)。 我想上個月。 如果當前月份為一月,我已經計算出了到十二月的上一個月份,例如:201301被轉換為201212。(我使用MOD來檢查最后兩位是否評估為1,如果是,它將遞減年份並將12附加為月份)
如果當前月份不是一月份,則我嘗試獲取上個月。 為此,我嘗試了-
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。
嘗試這個:
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.
您可以使用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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.