PostgreSQL,根据另一列添加(年,月或日)日期

Hel*_*ges 5 sql postgresql date add

我需要从8.4 POSTGRESQL数据库中查询,以列出代表产品保修终止的实际日期的日期订购的所有产品。

该表是这样的,我将使其简单化:

PRODUCT (varchar) 
WARRANTY (int)
TYPE_WARRANTY (char) ( 'Y', 'M', 'D' ) -- Years, Months or Days
CREATED_AT (date)
Run Code Online (Sandbox Code Playgroud)

举个例子:

PRODUCT  |  WARRANTY  |  TYPE_WARRANTY  |  CREATED_AT 
------------------------------------------------------
'PROD A' |      1     |       'Y'       | '2014-01-01'
'PROD B' |     10     |       'M'       | '2014-06-01'
'PROD C' |     30     |       'D'       | '2014-01-01'
Run Code Online (Sandbox Code Playgroud)

我需要的是一个查询,它将为我带来以下信息:

PRODUCT  |  WARRANTY  |  TYPE_WARRANTY  |  CREATED_AT  | WARRANTY_ENDS | DAYS
-----------------------------------------------------------------------------
'PROD C' |    30      |       'D'       | '2014-01-01' | '2014-01-31'  | -175
'PROD A' |     1      |       'Y'       | '2014-01-01' | '2015-01-01'  | 160
'PROD B' |    10      |       'M'       | '2014-06-01' | '2015-04-01'  | 250
Run Code Online (Sandbox Code Playgroud)

我希望你能理解

因此,我需要选择所有产品,并在保修期结束时订购它们,包括从今天到该日期之间的天数。

我已经拥有的:

我知道如何获取日期,我知道如何将间隔添加到日期,现在我所需要的只是一种使查询理解我要基于type_warranty列的值添加间隔的方法。

我以“ 1 +年”为例,它可以工作,但我也需要它像“ 1 +月”和“ 1 +天”一样动态地工作。

SELECT 
  PRODUCT, WARRANTY, TYPE_WARRANTY, CREATED_AT, 
  (CREATED_AT + (WARRANTY * '1 year'::INTERVAL)) as WARRANTY_ENDS,
  EXTRACT(day from age((CREATED_AT + '1 year', current_date)) as days
FROM TABLE
order by days; 
Run Code Online (Sandbox Code Playgroud)

这行得通,但仅适用于多年,我不知道如何根据保修类型将“ 1年”转换为“ 1个月”或“ 1天”

您有什么帮助的想法吗?

tsn*_*rri 3

我现在没有安装 PostgreSQL 8.4,但这可以吗?

SELECT
    PRODUCT, WARRANTY, TYPE_WARRANTY, CREATED_AT, 
    (CREATED_AT + (WARRANTY *
        CASE TYPE_WARRANTY
            WHEN 'Y' THEN '1 year'::interval
            WHEN 'M' THEN '1 month'::interval
            WHEN 'D' THEN '1 day'::interval
        END
    ))::date as WARRANTY_ENDS,
    (created_at + (warranty * itvalue))::date - current_date as days
    FROM TABLE;
Run Code Online (Sandbox Code Playgroud)