2017-02-22 7 views
1

私のデータベースには、「fine」というテーブルがあります。そのテーブルには、issue_date、expiry_date、およびfine_amountという3つのフィールドがあります。私は、発行日からexpiry_dateを計算します。有効期限は、常にissue_dateより20日を持っている必要があり、だから私は、としてクエリを書いた:SQLでdate_addで計算フィールドを作成できません

ALTER TABLE fine ADD 
expiry_date AS DATE_ADD(CURRENT_DATE,INTERVAL 20 DAY) 

しかし、構文エラーがあります。私は解決策を見つけることができないようです。

また、fine_amountを10 *(現在の日数が有効期限を超えた場合、現在の日付と有効期限の日数の差)にします。それをどうやって行うのですか?

+0

現在のテーブルを変更して計算カラムを作成するか、新しいテーブルを作成することを検討していますか? –

+0

'fee'テーブルを変更するが、新しいテーブルを作成することは大したことではない –

+0

[documentation](https://dev.mysql.com/doc/refman/5.7/en/create-table- generated-columns.html)。数式は非決定論的なので、計算された列にファインロジックを実装することはできません。 –

答えて

0

計算式の列を使用してファインロジックを実装することはできません。計算式には現在の時刻が非決定論的であるためです。 MySQL documentation

リテラル、確定的組み込み関数、および演算子は許可されています。テーブル内の同じデータを指定すると、接続されたユーザーとは無関係に複数の呼び出しが同じ結果を生成する場合、関数は決定的です。この定義に失敗した関数の例は、CONNECTION_ID()、CURRENT_USER()、NOW()です。

おそらく実際に選択した時点でこれらの列の値を計算するのが最もよい方法です。例:

SELECT issue_date, 
     DATE_ADD(issue_date, INTERVAL 20 DAY) AS expiry_date, 
     CASE WHEN NOW() > DATE_ADD(issue_date, INTERVAL 20 DAY) 
      THEN 10*DATEDIFF(NOW(), DATE_ADD(issue_date, INTERVAL 20 DAY)) 
      ELSE 0 END AS fine_amount 
FROM fine 
関連する問題