如何在 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;
您可以使用 TRUNC
和 MOD
函数,如下所示:
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
我会去 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
我有一个查询来检索两个日期之间的月数 -
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;
您可以使用 TRUNC
和 MOD
函数,如下所示:
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
我会去 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