2014-02-10 5 views
1

Я создаю базу данных, в которой будут храниться все виды оборудования, и одно из объектов хранит информацию о гарантии для этого оборудования. Одним из атрибутов, которые я хочу, является производный атрибут Is_Valid, который будет в основном «недействительным» или «действительным» в зависимости от того, прошла ли дата окончания условий гарантии.Как вычислить производные атрибуты для дат в запросе CREATE TABLE. - MySQL

я был в состоянии сделать это в SQL с этим запросом:

CREATE TABLE Warranty(
    Warranty_ID  varchar(5), 
    Begin_Date  date, 
    End_Date  date, 
    Terms   varchar(15), 
    Is_Valid as (IIF((GetDate() > Begin_Date) AND (GetDate() < End_date), 'valid','not valid')), 
    Primary Key (Warranty_ID)); 

Однако, я пытался сделать это в MySQL, но я не могу заставить его работать. Единственный способ, которым я получил его, - использовать запрос UPDATE Warranty, используя case, но я предпочел бы, чтобы база данных делала это автоматически. Если я что-то понимаю неправильно, простите меня, потому что я новичок в структуре базы данных и ее реализации. Благодарю.

+1

AFAIK, вы не можете сделать это в MySQL. То, что вы пытаетесь сделать, определяется либо триггером «ON BEFURE INSERT» и 'ON BEFORE UPDATE», либо вы можете определить 'VIEW' с таким запросом' SELECT'. – Wrikken

ответ

1

Для начала в диалоговом окне MySQL GetDate() будет CURDATE() и IIF будет IF.

Кроме того, я полагаю, что вы используете BETWEEN для проверки диапазона значений: это изменяет поведение на BEGIN_DATE и датой_окончания (гарантия будет действительна включая эти даты), но, возможно, это также то, что вы предпочли бы ,

Вы можете использовать таблицу и вид на вершине ее в следующем виде:

CREATE TABLE Warranty(
    Warranty_ID  varchar(5), 
    Begin_Date  date, 
    End_Date  date, 
    Terms   varchar(15), 
    Primary Key (Warranty_ID)); 

CREATE VIEW vw_Warranty AS 
SELECT 
    Warranty_ID, 
    Begin_Date, 
    End_Date, 
    Terms, 
    IF(CURDATE() BETWEEN Begin_Date AND End_date, 'valid', 'not valid') as IS_Valid; 
+1

Функция IF() (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if), вероятно, лучше заменяет IIF(). В противном случае ответ выглядит хорошо. –

+0

Спасибо @TimBurch, обновил свой ответ с 'IF' (и' BETWEEN'). –

+0

Раньше я никогда не использовал представления, но я попробовал ваш (после добавления «FROM Warranty» в конце), и, похоже, он сработал! Итак, в основном, если я хочу запросить/вытащить ли какой-то элемент из гарантии, мне придется запросить представление vw_Warranty вместо гарантийной таблицы? – astalepancake

 Смежные вопросы

  • Нет связанных вопросов^_^