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天”
您有什么帮助的想法吗?
我现在没有安装 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)