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

Oracle SQL从6位数字获取上个月,sql,oracle,Sql,Oracle,月份字段是数字形式的YYYYMM。 我想要上个月的工资。如果当前月份是1月,我已经计算了截至12月的前一个月,例如:201301转换为201212。(我使用MOD检查最后两位数字是否计算为1,如果是,则递减年份,并附加12作为月份) 如果当前月份是一月以外的任何月份,我将尝试获取上一个月。为了这个我试过了- 1) select CONCAT( SUBSTR(201405,1,4), MOD(201405,100) - 1 ) from dual; 2) select CONCAT

月份字段是数字形式的YYYYMM。 我想要上个月的工资。如果当前月份是1月,我已经计算了截至12月的前一个月,例如: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.
试试这个:

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.
试试这个:

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.
试试这个:

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间隔可能很愚蠢,但仍然如此):

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

或者你可以试试这个:

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;

您可以使用
INTERVAL
(当然,整个过程不会符合ANSI标准,因此引入ANSI间隔可能很愚蠢,但仍然如此):

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

或者你可以试试这个:

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;

您可以使用
INTERVAL
(当然,整个过程不会符合ANSI标准,因此引入ANSI间隔可能很愚蠢,但仍然如此):

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

或者你可以试试这个:

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;

您可以使用
INTERVAL
(当然,整个过程不会符合ANSI标准,因此引入ANSI间隔可能很愚蠢,但仍然如此):

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

或者你可以试试这个:

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;

您是否可以使用
来指定日期()
,执行该操作,然后将其转换回数字?这将包括1月->12月以及所有其他情况。您应该将日期存储为日期而不是数字…您可以使用
TO_DATE()
,执行该操作,然后将其转换回数字吗?这将包括1月->12月以及所有其他情况。您应该将日期存储为日期而不是数字…您可以使用
TO_DATE()
,执行该操作,然后将其转换回数字吗?这将包括1月->12月以及所有其他情况。您应该将日期存储为日期而不是数字…您可以使用
TO_DATE()
,执行该操作,然后将其转换回数字吗?这将包括1月->12月的情况以及所有其他情况。你应该将日期存储为日期而不是数字…这可能会更复杂,因为没有像添加周这样的功能,你需要考虑很多事情。如果有此维度,则可以按此字段排序,并获取上一个值。对于这一点,您可以使用顺序依赖的滞后或超前分析函数。这可能更复杂,因为没有像add_weeks这样的函数,您需要考虑很多事情。如果有此维度,则可以按此字段排序,并获取上一个值。对于这一点,您可以使用顺序依赖的滞后或超前分析函数。这可能更复杂,因为没有像add_weeks这样的函数,您需要考虑很多事情。如果有此维度,则可以按此字段排序,并获取上一个值。对于这一点,您可以使用顺序依赖的滞后或超前分析函数。这可能更复杂,因为没有像add_weeks这样的函数,您需要考虑很多事情。如果有此维度,则可以按此字段排序,并获取上一个值。为此,您可以使用顺序相关的滞后或超前分析函数。