Postgresql,根据另一列添加(年、月或日)到日期
我需要一个来自8.4 POSTGRESQL数据库的查询,以列出我订购的所有产品,该日期表示产品保修期结束的实际日期 这张桌子是这样的,我要简单一点:Postgresql,根据另一列添加(年、月或日)到日期,sql,postgresql,date,add,Sql,Postgresql,Date,Add,我需要一个来自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_A
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_保修列的值添加时间间隔
我在这里以“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天”
你有什么想法可以帮我吗?我现在没有安装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;
避免每次需要使用外部表进行日期运算时出现
案例的笨拙。在本例中,它是一个CTE表,但它应该是一个真实的表。或者只需将保修
列更改为间隔
with itval (type_warranty, itvalue) as (
values ('D', '1 day'::interval), ('M', '1 month'), ('Y', '1 year')
)
select
product,
warranty,
type_warranty,
created_at,
created_at + (warranty * itvalue) as warranty_ends,
(created_at + (warranty * itvalue))::date - current_date as days
from
t
inner join
itval using (type_warranty)
order by days;
基于extract
和age
的天数算法不起作用。效果很好!但是,我意识到最后一个专栏(days专栏)我错了。它不计算日期之间的天数,只计算日期之间的天数。我在我的代码中替换了在“保修结束”列中创建的。它只从-30到30。你知道如何修复它吗?我用clodaldo neto的解决方案修复了“DAYS”列,它现在可以工作了。谢谢你们两位!是的,刚刚意识到。谢谢,我用Tsnori的方式得到了保修结束栏,你的方式得到了“天”栏,效果很好。非常感谢。