首页 > 解决方案 > 日期 yyyy-mm 格式为整数

问题描述

我需要将当前月份减去一个月,然后将其转换为格式 yyyy-mm 并将其转换为整数。然后将其分配给一个变量,以便在 where 子句中进行下一次比较。

所以逻辑是这样的

  1. 今天是 20.03.2019(或任何日期和月份)
  2. 减法后是 01.02.2019
  3. 转换为 YYYY-MM 格式后为 201902
  4. 转换为整数后为 201902 整数

你能帮我在 Oracle 中使用 SQL 方法吗?

标签: sqloracledate

解决方案


您可以使用以下表达式:

to_number(to_char(trunc(add_months(sysdate, -1), 'MM'), 'YYYYMM'))

add_months(sysdate, -1)为您提供一个月前的今天日​​期。

trunc(add_months(sysdate, -1), 'MM')给你那个月的第一天,通过参数MMto trunc()

将其to_char(trunc(sysdate, 'MM') - interval '1' month, 'YYYYMM')转换为字符串'201902'

最后to_number(to_char(trunc(sysdate, 'MM') - interval '1' month, 'YYYYMM'))将该字符串转换为数字。

截断步骤实际上并不是必需的,因为无论如何您都忽略了一天部分,但我已将其保留以匹配您第二步中显示的值。

您也可以这样做-将当前月份截断到第一天后trunc(sysdate, 'MM') - interval '1' month减去间隔。反过来,或者不截断,您可能会收到日期错误,例如如果在 7 月 31 日运行 - 因为没有 6 月 31 日。

例子:

select to_number(to_char(trunc(add_months(sysdate, -1), 'MM'), 'YYYYMM')) from dual;

TO_NUMBER(TO_CHAR(TRUNC(ADD_MONTHS(SYSDATE,-1),'MM'),'YYYYMM'))
---------------------------------------------------------------
                                                         201902

select to_number(to_char(add_months(sysdate, -1), 'YYYYMM')) from dual;

TO_NUMBER(TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYYMM'))
---------------------------------------------------
                                             201902

select to_number(to_char(trunc(sysdate, 'MM') - interval '1' month, 'YYYYMM')) from dual;

TO_NUMBER(TO_CHAR(TRUNC(SYSDATE,'MM')-INTERVAL'1'MONTH,'YYYYMM'))
-----------------------------------------------------------------
                                                           201902

然后将其分配给一个变量,以便在 where 子句中进行下一次比较。

您可以直接在where子句中使用该表达式。如果你将它包含在选择列表中,你可以给它一个列别名;但是您不能where在同一查询级别的子句中引用该别名。您将需要使用子查询(内联视图)或 CTE - 或者只是重复完整的表达式。


推荐阅读