【发布时间】:2014-09-17 10:45:13
【问题描述】:
我需要来自 8.4 POSTGRESQL 数据库的查询来列出我订购的所有产品,该日期代表产品保修结束的实际日期。
表是这样的,我简单说一下:
PRODUCT (varchar)
WARRANTY (int)
TYPE_WARRANTY (char) ( 'Y', 'M', 'D' ) -- Years, Months or Days
CREATED_AT (date)
举个例子:
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'
我需要的是一个能带给我这个的查询:
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
希望你能理解
所以我需要选择所有产品并在保修期结束时订购它们,包括从今天到该日期之间的天数。
我已经拥有的:
我知道如何获取天数,我知道如何将间隔添加到日期,我现在需要的只是一种让查询了解我想根据 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;
这可行,但当然只有几年,我不知道如何根据保修类型将“1 年”转换为“1 个月”或“1 天”
你有什么想法可以帮忙吗?
【问题讨论】:
标签: sql postgresql date add