Генерация даты в таблице SQL - PullRequest
1 голос
/ 02 ноября 2019

У меня есть база данных на SQL, которая содержит информацию о студентах и ​​книгах, которые они заимствуют.

У меня есть таблица ссуд, которая включает book_id, student_id, день, когда была взята книга, и количество дней, в течение которых она может храниться.

Я хочу автоматически сгенерировать return_date, добавив дни на дату, когда была взята книга. Как я могу сделать это, используя MySQL Workbench?

Ответы [ 3 ]

1 голос
/ 02 ноября 2019

Вы можете использовать Функция даты и времени MySQL date_add() для вычисления цели return_date. Предполагая, что дата, когда книга была отдана в аренду, называется loan_date, а продолжительность хранится в loan_duration, выраженном в днях:

select
    book_id,
    student_id,
    loan_date,
    date_add(loan_date, interval loan_duration day) return_date
from loan_table

В операторе обновления:

update loan_table
set return_date = date_add(loan_date, interval loan_duration day)
where return_date is null -- only compute the return_dates that were not yet computed

Редактировать

Если вы хотите, чтобы это значение было автоматически сгенерировано , можно использовать сгенерированный сохраненный (или виртуальный) столбец (доступноначиная с MySQL 5.7). Это работает путем определения правила вычисления, которое MySQL будет автоматически применять при вставке или обновлении записи.

Демонстрация на БД Fiddle :

-- set up
create table loan_table(
    id int primary key auto_increment,
    book_id int,
    student_id int,
    loan_date date,
    loan_duration int,
    -- here is the generated column
    return_date date 
        as (date_add(loan_date, interval loan_duration day)) stored
);

-- perform an insert
insert into loan_table(book_id, student_id, loan_date, loan_duration)
values(1, 1, '2019-11-02', 3)

-- check the computed value
select * from loan_table;
id | book_id | student_id | loan_date  | loan_duration | return_date
-: | ------: | ---------: | :--------- | ------------: | :----------
 1 |       1 |          1 | 2019-11-02 |             3 | 2019-11-05 
1 голос
/ 02 ноября 2019

Вы можете использовать комбинацию интервала и +:

select book_id
       , student_id
       , date_taken
       , number_od_days
       , (date_taken + interval number_od_days day) as return_date
from loans;

Вот пример в DEMO

Если вы хотите, чтобы этот столбец был автоматически увеличенЯ предлагаю вам создать триггер в вашей таблице:

CREATE TRIGGER rentcheck 
BEFORE INSERT ON loans 
FOR EACH ROW 
begin
    if new.number_od_days < 0 or new.number_od_days is null then
      signal sqlstate '45000';
    else
      set new.return_date = (new.date_taken + interval new.number_od_days day);
    end if;
end;

С его помощью вы можете контролировать, будет ли столбец number_of_days отрицательным или не будет введен, потому что это приведет к нелогичным данным. Вот демо для триггера: DEMO

0 голосов
/ 02 ноября 2019

вы можете использовать переменные в mysql:

set @days = 10;
set @mydate := DATE_ADD("2019-11-01", INTERVAL @days DAY);
select @mydate;

, а затем использовать оператор вставки:

Insert into Loan(... ,[return_date])
values (...., @mydate)

Надеюсь, это поможет

...