我的桌子上有(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
答案 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
中的所有选项