月份和年份的 SQL 查询

Posted

技术标签:

【中文标题】月份和年份的 SQL 查询【英文标题】:SQL query for Month and Year 【发布时间】:2020-12-10 11:45:53 【问题描述】:

查找 Oracle SQL 查询以显示从当前年份 - 1y 和当前年份 +1y 开始的月份和年份。 例如:2019 年 12 月、2020 年 1 月、2020 年 2 月、...... 2021 年 12 月

【问题讨论】:

您真的想要 PL/SQL 还是 Oracle SQL 就足够了? Oracle SQL 就够了 。 .在那种情况下,我喜欢我的回答。 【参考方案1】:

您可以按如下方式使用层次结构查询:

SQL> SELECT trunc(ADD_MONTHS(ADD_MONTHS(sysdate,-12), LEVEL-1), 'Mon') as  month_year
  2    FROM DUAL CONNECT BY LEVEL <= 24 + 1;

MONTH_YEAR
--------------
December  2019
January   2020
February  2020
March     2020
April     2020
May       2020
June      2020
July      2020
August    2020
September 2020
October   2020
November  2020
December  2020
January   2021
February  2021
March     2021
April     2021
May       2021
June      2021
July      2021
August    2021
September 2021
October   2021
November  2021
December  2021

25 rows selected.

SQL>

【讨论】:

谢谢...位已修改-> SELECT to_char(trunc(ADD_MONTHS(ADD_MONTHS(sysdate,-12), LEVEL-1), 'Mon'),'MONTH yyyy') as month_year FROM按级别进行双重连接 【参考方案2】:

有多种方法可以做到这一点。我认为像这样的简单示例是了解递归 CTE 的好机会:

with dates(yyyymm, n) as (
      select trunc(sysdate, 'Mon') as yyyymm, 1 as n
      from dual
      union all
      select add_months(yyyymm, -1), n + 1
      from dates
      where n <= 12
     )
select yyyymm
from dates;

【讨论】:

【参考方案3】:
WITH d AS (
    SELECT
        'JAN' m,
        2021 y
    FROM
        dual
), d1 AS (
    SELECT
        to_date(m || y, 'MONYYYY') first_day,
        last_day(to_date(m || y, 'MONYYYY')) last_day1,
        last_day(to_date(m || y, 'MONYYYY')) - to_date(m || y, 'MONYYYY') no_of_days
    FROM
        d
)
SELECT
    level - 1 + first_day dates
FROM
    d1
CONNECT BY
    level <= no_of_days + 1;

【讨论】:

以上是关于月份和年份的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL Select 查询以选择日期之间的数据,其中从日期月份高于日期月份和年份差异>1

sql 根据年份月份查询数据

在MySql中、怎样根据年份或者月份查询数据表中的数据?

在 SQL 中为给定年份设置硬编码的日期和月份

数据库_Mysql查询当前年份的sql

sql按月查询语句