2017-07-28 3 views
2

(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

チェックアウトすべてのオプションは、あなたは、MySQLやPostgreSQLを使用していますか?両方のデータベースで日付操作と書式設定の機能が異なります。 *両方の*データベースで動作する文が存在する可能性は低いです。 – joanolo

+0

PostgreSQL。 redshiftでこのクエリを実行するDB –

+0

Postgres –

答えて

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 ; 

とPostgreSQLは日付(またはタイムスタンプ)に間隔を追加すると、タイムスタンプを返します方法を知っているだけのこと

 
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 

注意を取得します。

は、あなたの間隔を指定するには、使用する必要が

cast(warranty_period || ' days' AS interval) 

またはSQL標準に近い、あるいは特定のPostgreSQL date/time function使用

make_interval(days := warranty_period) 

を使用

warranty_period * interval '1 day' 

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

(日付+整数)のため+オペレータが存在するという事実に依存しているの数として整数を扱います:あなたはまた、(最も簡単な)形式を使用することができます


、および同じ操作を実行します。この場合、列purchase_timestamp、実際にはとするか、CAST(... AS date)とする必要があります。 dbfiddle here

+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' format.ThenでのみMySQLのエンジンは、日付とあなたの文字列を考慮する必要があります。

上記のクエリを試すことができます。

ここにはFiddle demoがあります。

+0

に「date_sub() 'がありませんerrorERRORを取得しています:「warranty_period」またはその近くの構文エラーPosition –

+0

@PreetiKumarテーブル名を入力して実行しようとしました。 –

+0

@PreetiKumar http://sqlfiddle.com/#!9/b8bbcd/1 –

関連する問題