как отобразить год и месяц как 1Y2M в запросе sql - PullRequest
1 голос
/ 28 февраля 2020

У меня есть запрос для получения количества месяцев между двумя датами -

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

Теперь этот запрос возвращает данные вроде - 0,1, 1,5 и c. Я хочу, чтобы запрос дал результаты, такие как 1 год 2 месяца, 1 месяц и т. Д. c. Как этого достичь?

Ответы [ 5 ]

1 голос
/ 01 марта 2020

Я бы go по документации :

Интервальные типы данных не имеют форматных моделей. Поэтому для настройки их представления необходимо объединить символьные функции, такие как 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
0 голосов
/ 28 февраля 2020

Oracle имеет INTERVAL YEAR TO MONTH тип данных, который вы можете использовать:

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

dbfiddle

0 голосов
/ 28 февраля 2020

Вы можете использовать функции TRUNC и MOD следующим образом:

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

Cheers !!

0 голосов
/ 28 февраля 2020

Преобразование символов будет происходить по умолчанию, и вы не должны делить на 12 при вычислении num_months:

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;

Надеюсь, это поможет.

0 голосов
/ 28 февраля 2020

Мы можем попытаться вычислить годы и месяцы, используя деление и модуль, а затем отобразить результат так, как вы хотите.

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;
...