Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql,根据另一列添加(年、月或日)到日期_Sql_Postgresql_Date_Add - Fatal编程技术网

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

我需要一个来自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_保修列的值添加时间间隔

我在这里以“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的方式得到了保修结束栏,你的方式得到了“天”栏,效果很好。非常感谢。