【问题标题】:Can i read interval value from another column in database我可以从数据库中的另一列读取间隔值吗
【发布时间】:2017-07-28 05:45:18
【问题描述】:

我有一张桌子,几天后有(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

【问题讨论】:

  • 您使用的是 MySQL 还是 PostgreSQL?两个数据库中的日期操作和格式化功能不同。不太可能有一个语句在两个数据库上运行。
  • PostgreSQL。在 redshift DB 上运行此查询
  • Postgres 中没有date_sub()

标签: sql amazon-redshift


【解决方案1】:

假设这是您的桌子:

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 ;

得到

监护人 | 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) 有一个 + 运算符,它将整数视为 天数,并执行相同的操作。在这种情况下,purchase_timestamp实际上应该是一个日期,或者是CAST(... AS date)

查看所有选项 dbfiddle here

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 出现错误错误:在“warranty_period”位置或附近出现语法错误
    • @PreetiKumar 你必须输入你的表名然后尝试执行。
    • 我正在尝试使用表名。在 sqlfiddle 上检查 - 同样的错误。
    • 哪个错误??你检查过这个sqlfiddle.com/#!9/b8bbcd/1 吗??
    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2013-01-28
    • 2010-12-29
    • 2018-07-28
    相关资源
    最近更新 更多