【问题标题】:how to display year and month as 1Y2M in sql query如何在sql查询中将年月显示为1Y2M
【发布时间】:2020-06-12 18:00:06
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您要比较的两个日期是 22 JAN 202017 APR 2020,那么期望的结果是什么?你似乎想要整数年,整数月。那么,您将如何处理我给出的示例?

标签: sql oracle date intervals date-formatting


【解决方案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;

【讨论】:

    【解决方案2】:

    您可以使用TRUNCMOD函数如下:

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

    干杯!!

    【讨论】:

      【解决方案3】:

      默认情况下会进行字符转换,在 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;
      

      希望这会有所帮助。

      【讨论】:

      • 为什么要申请FLOORMOD(num_months, 12)?这已经是一个整数,因为num_months 是一个整数。
      • TRUNC(MONTHS_BETWEEN(SYSDATE+365,SYSDATE),0) 将是一个整数...在查询中使用TRUNC(MONTHS_BETWEEN(SYSDATE+365,SYSDATE),1),这将给出一个小数点1...话虽如此,我可以简单地使用 trunc(date ,0)...我将编辑我的答案
      • 哦,好吧...我没有注意到您(像 OP 一样)四舍五入到小数点后一位。现在说得通了!
      【解决方案4】:

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

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

      dbfiddle

      【讨论】:

        【解决方案5】:

        我会去by the documentation:

        区间数据类型没有格式模型。因此,要调整它们的呈现方式,必须将EXTRACT等字符函数组合起来,并将组件连接起来。

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

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-18
          • 2011-09-11
          • 2018-10-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多