2017-02-22 124 views
1

在我的数据库中,我有一个名为'fine'的表,该表中我有三个字段,issue_date,expiry_date和fine_amount。我希望从发布日期计算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

更改'费用'表,但创建一个新表格不会太麻烦 –

+0

检查[documentation](https://dev.mysql.com/doc/refman/5.7/en/create-table-产生-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 
相关问题