如何在 sql 查询中将年份和月份显示为 1Y2M

how to display year and month as 1Y2M in sql query

我有一个查询来检索两个日期之间的月数 -

select Trunc(Months_between(Trunc(SYSDATE), CUR_EFF_DATE ) / 12, 1) 
from xyz

现在查询 returns 数据,如 - 0.1、1.5 等。我希望查询给出诸如 1 年 2 个月、1 个月等结果。如何实现?

我们可以尝试使用除法和模数计算年和月,然后以您想要的方式显示输出。

WITH cte AS (
    SELECT TRUNC(MONTHS_BETWEEN(TRUNC(SYSDATE), CUR_EFF_DATE) / 12, 1) AS num_months
    FROM xyz
)

SELECT
    TO_CHAR(FLOOR(num_months / 12)) || 'Y' ||
        TO_CHAR(MOD(num_months, 12)) || 'M' AS output
FROM cte;

您可以使用 TRUNCMOD 函数,如下所示:

SELECT TRUNC(MONS/12) || 'Y' || MOD(MONS,12) || 'M' 
FROM
(SELECT MONTHS_BETWEEN(TRUNC(SYSDATE), CUR_EFF_DATE) MONS
FROM XYZ)

干杯!!

默认情况下会进行字符转换,您不应在 num_months 计算中除以 12:

WITH cte AS (
    SELECT TRUNC(MONTHS_BETWEEN(SYSDATE+365,SYSDATE),0) AS num_months
    FROM dual
)

SELECT
    FLOOR(num_months/12) || 'Y' || MOD(num_months, 12) || 'M' AS output
FROM cte;

希望对您有所帮助。

Oracle 有 INTERVAL YEAR TO MONTH 数据类型,您可以使用:

select (sysdate - cur_eff_date) year to month as diff from xyz

dbfiddle

我会去 by the documentation:

Interval data types do not have format models. Therefore, to adjust their presentation, you must combine character functions such as EXTRACT and concatenate the components.

下面是一个示例,它看起来很像您的用例,可以按如下方式进行调整:

select 
    extract(year from (sysdate - cur_eff_date) year to month)
    || ' year(s) '
    || extract(month from (sysdate - cur_eff_date) year to month)
    || ' month(s)' 
    as date_diff
from xyz