簡體   English   中英

Oracle SQL從6位數字NUMBER獲取上個月

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM