Как использовать интервал для точного количества лет? - PullRequest
0 голосов
/ 25 июня 2019

Мне нужно отформатировать таким образом, чтобы получить количество лет, месяцев и их комбинацию или «Нет гарантии», в зависимости от того, есть гарантия на данный продукт или нет.Я пытался с case + extract, но он не работал

    select p.product_name, sum(o.quantity) as total_quantity,

    case when p.warranty_period = interval '0-0' year to month then 'No 
    warranty'

    when p.warranty_period < interval '0-11' year to month then 
    extract(month from p.warranty_period) || ' months'

    when p.warranty_period < interval '21-0' year to month then -- make it 
    for all years, not only 1
    extract(year from p.warranty_period) || ' years'

    when p.warranty_period > interval '0-0' year to month then 
    extract(year from p.warranty_period) || ' years and ' || extract(month 
    from p.warranty_period)
    || ' months'

    end WARRANTY from PRODUCT_INFORMATION p
    join order_items o on p.product_id = o.product_id
    group by p.product_name, p.warranty_period;

Я ожидаю получить столбец ГАРАНТИЯ с 4 переменными:

Без гарантии

  • лет
  • месяцев
  • лет и месяцев

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Вы можете использовать что-то вроде следующего:

-- Data preparation
create table product (warranty_period INTERVAL YEAR TO MONTH);
insert into product values(INTERVAL '2-0' YEAR TO MONTH)
insert into product values(INTERVAL '1-5' YEAR TO MONTH)
insert into product values(INTERVAL '0-7' YEAR TO MONTH)
insert into product values(INTERVAL '0-0' YEAR TO MONTH)

-

-- Data in Table
select * from product

enter image description here

-

-- Your query
SELECT
    WARRANTY_PERIOD,
    CASE
        WHEN WARRANTY_PERIOD > INTERVAL '1-0' YEAR TO MONTH 
        THEN EXTRACT(YEAR FROM WARRANTY_PERIOD)
             || ' years '
             || CASE
                WHEN EXTRACT(MONTH FROM WARRANTY_PERIOD) <> 0 
                THEN EXTRACT(MONTH FROM WARRANTY_PERIOD)
                     || ' month'
                END
        WHEN WARRANTY_PERIOD > INTERVAL '0-1' YEAR TO MONTH 
        THEN EXTRACT(MONTH FROM WARRANTY_PERIOD)
             || ' month'
        ELSE 'No warranty'
    END AS WARRANTY
FROM
    PRODUCT

Выход

enter image description here

-

Db Fiddle Demo

ура !!

1 голос
/ 25 июня 2019

Просто используйте EXTRACT в операторе CASE и проверяйте, когда месяц и / или годы равны нулю:

SELECT p.product_name,
       SUM(o.quantity) AS total_quantity,
       CASE
         WHEN EXTRACT( MONTH FROM p.warranty_period ) = 0
         AND  EXTRACT( YEAR  FROM p.warranty_period ) = 0
           THEN 'No warranty'
         WHEN EXTRACT( MONTH FROM p.warranty_period ) = 0
           THEN EXTRACT( YEAR  FROM p.warranty_period ) || ' years'
         WHEN EXTRACT( YEAR  FROM p.warranty_period ) = 0
           THEN EXTRACT( MONTH FROM p.warranty_period ) || ' months'
         ELSE   EXTRACT( YEAR  FROM p.warranty_period ) || ' years and '
                || EXTRACT( MONTH FROM p.warranty_period ) || ' months'
       END AS WARRANTY
FROM   PRODUCT_INFORMATION p
       JOIN order_items o
       ON p.product_id = o.product_id
GROUP BY
       p.product_name,
       p.warranty_period;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...