我可以从数据库中的另一列读取间隔值

时间:2017-07-28 05:45:19

标签: sql amazon-redshift

我的桌子上有(custid,purchase_timestamp (dd-mm-yyyy), warranty_period)天。我需要purchase_time和warranty_period的总和。我怎么能为此编写SQL。

我试过

SELECT DATE_SUB(purchase_timestamp, INTERVAL warranty_period DAY); 

但它不起作用。请建议

 |custid |    warranty_period  |   purchase_timestamp
    |1        |      365            |   03-01-2017  
    |2        |      30             |   03-04-2017
    |3        |     10              |   25-05-2017
    |4        |      30             |   20-05-2017
    |5        |     365             |   04-06-2017
    |6        |     100             |   18-06-2017
    |7        |     90              |   30-06-2017
    |8        |     10              |   05-07-2017
    |9        |        30           |   09-07-2017
    |10       |     365             |   17-07-2017

2 个答案:

答案 0 :(得分:0)

<强> SELECT DATE_SUB(STR_TO_DATE(purchase_timestamp,'%d-%m-%Y'), INTERVAL warranty_period DAY);

您可以尝试以上代码。

我在这里添加了函数STR_TO_DATE

使用此功能,您必须将字符串转换为 DATE

否则您的 DATE 字段必须采用 'YYYY-MM-DD' 格式。然后只有MySQL引擎会将您的字符串视为日期。

您可以尝试以上查询。

这是Fiddle demo

答案 1 :(得分:0)

我们假设这是你的表:

CREATE TABLE t
(
    custid integer,
    warranty_period integer,
    purchase_timestamp date /* timestamp ? */
);

有这些数据:

INSERT INTO t
    (custid, warranty_period, purchase_timestamp)
VALUES
    ( 1, 365, '03-01-2017'),  
    ( 2,  30, '03-04-2017'),
    ( 3,  10, '25-05-2017'),
    ( 4,  30, '20-05-2017'),
    ( 5, 365, '04-06-2017'),
    ( 6, 100, '18-06-2017'),
    ( 7,  90, '30-06-2017'),
    ( 8,  10, '05-07-2017'),
    ( 9,  30, '09-07-2017'),
    (10, 365, '17-07-2017') ;

您可以使用以下SELECT

SELECT 
    custid,
    purchase_timestamp + cast(warranty_period || ' days' AS interval) AS end_of_warranty 
FROM
    t 
ORDER BY
    custid ;

SELECT 
    custid,
    purchase_timestamp + make_interval(days := warranty_period) AS end_of_warranty 
FROM
    t 
ORDER BY
    custid ;

并获取

custid | end_of_warranty    
-----: | :------------------
     1 | 2018-01-03 00:00:00
     2 | 2017-05-03 00:00:00
     3 | 2017-06-04 00:00:00
     4 | 2017-06-19 00:00:00
     5 | 2018-06-04 00:00:00
     6 | 2017-09-26 00:00:00
     7 | 2017-09-28 00:00:00
     8 | 2017-07-15 00:00:00
     9 | 2017-08-08 00:00:00
    10 | 2018-07-17 00:00:00

请注意,PostgreSQL知道如何间隔添加到日期(或时间戳),并返回时间戳。

要指定您需要使用的间隔

cast(warranty_period || ' days' AS interval)

warranty_period * interval '1 day'

接近SQL标准,或使用

make_interval(days := warranty_period)

使用特定的PostgreSQL date/time function

您也可以使用(最简单)形式:

SELECT 
    custid,
    purchase_timestamp + warranty_period AS end_of_warranty 
FROM
    t 
ORDER BY
    custid ;

这取决于(date + integer)有+运算符将整数视为 days 的数量,并执行相同的操作。在这种情况下,列purchase_timestamp实际为日期,或CAST(... AS date)

查看 dbfiddle here

中的所有选项