2017-02-22 3 views
1

В моей базе данных у меня есть таблица «fine», в этой таблице у меня есть три поля: issue_date, expiry_date и fine_amount. Я хочу, чтобы expiry_date был вычислен с даты выпуска. Срок годности всегда должен иметь 20 дней больше, чем issue_date, поэтому я написал запрос как:Невозможно создать вычисленное поле с date_add в SQL

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

Но есть ошибка синтаксиса. Я не могу найти решение.

Также я хочу, чтобы fine_amount составлял 10 * (разница в днях между текущей датой и датой истечения срока действия, если текущие дни превышают дату истечения срока действия). Как мне это сделать?

+0

Вы хотите изменить текущую таблицу, чтобы иметь вычисленный столбец, или создать новую таблицу в целом? –

+0

Изменение таблицы «плата», но создание новой таблицы не сильно беспокоило бы. –

+0

Проверьте [документацию] (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 
Смежные вопросы