drop database testDB;
create database testDB;
use testDB;
create table testDB(
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(45) ,
deposit_date DATETIME,
deposit_amount INT,
interest_amount INT,
CONSTRAINT testTable_PK PRIMARY KEY(id)
);
set @setTime = (select subtime(now(),'00:02:00'));
insert into testdb (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);
drop function if exists fibo_number;
DELIMITER //
CREATE FUNCTION fibo_number(n INT) RETURNS INT
DETERMINISTIC
BEGIN
DECLARE f_0 INT default 0;
DECLARE f_1 INT default 1;
DECLARE out_fib INT;
DECLARE i INT;
DECLARE f_2 INT;
SET f_0 = 0;
SET f_1 = 1;
SET i = 1;
WHILE (i<=n) DO
SET f_2 = f_0 + f_1;
SET f_0 = f_1;
SET f_1 = f_2;
SET i = i + 1;
SET out_fib = f_0;
END WHILE;
RETURN out_fib;
END //
set @n = (select fibo_number(6))//
select @n//
drop procedure if exists pro//
create procedure pro()
begin
while (select id from testdb order by id desc limit 1) < 10 do
INSERT INTO testdb (name,deposit_date,deposit_amount,interest_amount)
select
(select MIN(name) from testdb),
date_add((select MAX(deposit_date) from testdb),INTERVAL @n minute),
((select MIN(deposit_amount) from testdb ) - (select MAX(interest_amount) from testdb)),
(select deposit_amount from testdb where id =1)* 0.02;
end while;
end //
delimiter ;
call pro();
select * from testdb;
use test;
truncate sequence;
set @setTime = (select subtime(now(),'00:02:00'));
insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);
drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select id from sequence order by id desc limit 1) < 10 do
INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount)
select
(select name from sequence order by id desc limit 1),
date_add((select deposit_date from sequence order by id desc limit 1),INTERVAL 1 hour),
((select deposit_amount from sequence order by id desc limit 1) + (select interest_amount from sequence order by id desc limit 1)),
(select deposit_amount from sequence where id=1)* 0.04 /12;
end while;
end //
delimiter ;
call pro();
select * from sequence;
use test;
truncate sequence;
set @setTime = (select subtime(now(),'00:02:00'));
insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);
drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select MAX(id) from sequence) < 10 do
INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount)
select
(select MIN(name) from sequence),
date_add((select MAX(deposit_date) from sequence),INTERVAL 1 hour),
((select MIN(deposit_amount) from sequence) - (select MAX(interest_amount) from sequence)),
(select MAX(deposit_amount) from sequence)* 0.02;
end while;
end //
delimiter ;
call pro();
select * from sequence;
이거는 order by 랑 섞어서 쓴거.
use test;
truncate sequence;
set @setTime = (select subtime(now(),'00:02:00'));
insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);
drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select MAX(id) from sequence) < 10 do
INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount)
select
(select MIN(name) from sequence),
date_add((select MAX(deposit_date) from sequence),INTERVAL 1 hour),
((select deposit_amount from sequence where deposit_amount order by id desc limit 1) - (select MAX(interest_amount) from sequence)),
(select deposit_amount from sequence where id =1)* 0.02;
end while;
end //
delimiter ;
call pro();
select * from sequence;
select deposit_amount where deposit_amount order by id desc limit 1
이 order by id dec limit 1
을 사용해서 마지막행 값을 구했었다.
우와 max로 썼더니
null값 사라짐!
확실한 건 코드가 짧아져서 너무 좋음ㅋㅋㅋㅋ
구하려는 열과 테이블만 적으면 됨
use test;
truncate sequence;
set @setTime = (select subtime(now(),'00:02:00'));
insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);
drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select MAX(id) from sequence) < 10 do
INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount)
select
(select MIN(name) from sequence),
date_add((select MAX(deposit_date) from sequence),INTERVAL 1 hour),
((select MAX(deposit_amount) from sequence) + (select MAX(interest_amount) from sequence)),
(select MIN(deposit_amount) from sequence)* 0.04 /12;
end while;
end //
delimiter ;
call pro();
select * from sequence;
set @setTime = (select subtime(now(),'00:02:00'));
insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,'10000000','0');
drop procedure if exists pro; delimiter // create procedure pro() begin while (select id from sequence order by id desc limit 1) < 10 do
INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) select (select name from sequence order by id desc limit 1), date_add((select deposit_date from sequence where deposit_date order by id desc limit 1),INTERVAL 1 hour), ((select deposit_amount from sequence where deposit_amount order by id desc limit 1) + (select interest_amount from sequence where interest_amount order by id desc limit 1)), (select deposit_amount from sequence where id='1')* 0.04 /12;
end while; end // delimiter ;
call pro();
select * from sequence;
아 다음행에 insert 추가 되는게
마지막 id가 9이니까
10까지 뜨는거구나~!!
그래도 deposit_amount의 마지막행 10000000을 구해서 이자액 33333을 구했으면
use test; truncate sequence; set @setTime = (select subtime(now(),'00:02:00')); insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);
drop procedure if exists pro; delimiter // create procedure pro() begin DECLARE n varchar(45) default "이소윤" ;
while (select id from sequence order by id desc limit 1) < 10 do INSERT INTO sequence (deposit_date) select (date_add((select deposit_date from sequence where deposit_date order by id desc limit 1),INTERVAL 1 hour));
update sequence set name = n, interest_amount = (select deposit_amount where deposit_amount order by id desc limit 1)* 0.04 /12;
end while;
end // delimiter ; call pro();
select * from test.sequence;
---
시간 증가만 insert해주고
나머지는 update로 넣어주려 했으나 잘안됨..
그래서 원래 한번에 다 insert한 걸로 수정함
중간에 null인거..
흠
그냥 id가 2인거 조건으로 넣어줌..
이러면 안될거같지만
use test;
truncate sequence;
set @setTime = (select subtime(now(),'00:02:00'));
insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);
drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select id from sequence order by id desc limit 1) < 10 do
INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount)
select
(select name from sequence order by id desc limit 1),
date_add((select deposit_date from sequence where deposit_date order by id desc limit 1),INTERVAL 1 hour),
((select deposit_amount from sequence where deposit_amount order by id desc limit 1) + (select interest_amount from sequence where interest_amount order by id desc limit 1)),
(select deposit_amount from sequence where id='1')* 0.04 /12;
end while;
end //
delimiter ;
call pro();
update sequence
set deposit_amount = 10000000
where id = 2;
select * from sequence;
create procedure pro(i int)
begin
while i < 5 do
insert into sequence (interest_amount) values (i);
set i = i +1;
end while;
end
//
DELIMITER ;
call pro(0);
커맨트 창에 명령어입력할때 한 줄씩 넣어야 작동하네...
while 기본적인 거 했으니까 과제해보기
1시간씩 이자액 증가하기
명령문 실행했을 때
기준 시간보다 몇 시간 지나있으면 그 몇시간 만큼 이자액 증가.
DELIMITER //
create procedure pro(i)
while if (기준시간 + 1 분 * i) > 기준시간 ,이면 실행한다. do
이자액 증가 실행
insert into sequence (interest_amount) values (증가한 이자액 넣기);
SELECT * FROM test.sequence; drop procedure if exists pro; delimiter // create procedure pro() begin while @min < 30 do set @min = minute((SELECT TIMEDIFF(now(),'2022-05-11 10:30:00'))); set @deposit_amount =(select deposit_amount from sequence where id='1'); select @min; insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12)); end while; end // delimiter ;
call pro();
오 뭔가 함 근데 계속 들어가!!!!
1분 지났을때만 추가되어야하는데..
SELECT * FROM test.sequence; truncate sequence;
insert into sequence (name,deposit_date,deposit_amount) values ('이소윤','20200509','10000000');
drop procedure if exists pro; delimiter // create procedure pro() begin while @min <10 do set @min = minute( (SELECT TIMEDIFF(now(),'2022-05-11 11:48:00')) ); set @deposit_amount =(select deposit_amount from sequence where id='1'); select @min; insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12)); end while; end // delimiter ;
call pro();
1분마다 바뀌어야하는데 초 차이날때마다 업데이트됨
워크벤치에서 한번에 실행하고 싶은데 왜 cmd에서는 잘되어도 워크벤치는null값으로 계속 찍힐까?
계속 찍힘 이렇게..
-------------------
SELECT * FROM test.sequence;SELECT * FROM test.sequence; truncate sequence;
insert into sequence (name,deposit_date,deposit_amount) values ('이소윤','20200509','10000000');
drop procedure if exists pro; delimiter // create procedure pro() begin
set @deposit_amount =(select deposit_amount from sequence where id='1'); while @min <10 do set @min = minute( (SELECT TIMEDIFF(now(),'2022-05-11 14:26:00')) ); if ( @min /@min >0) then insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12)); end if; end while;
end // delimiter ;
call pro();
----
set @lastTime = (select deposit_date from sequence where deposit_date order by id desc limit 1);
만약, 이전분보다 1분 흘렀으면
if (SELECT TIMEDIFF(now(),마지막행시간)) > '00:01:00'
set 흐른분 = minute(SELECT TIMEDIFF(now(),마지막행시간))
마지막행에 넣기 흐른분* 이자율
////////////////
SELECT * FROM test.sequence;SELECT * FROM test.sequence; truncate sequence; set @test = (select subtime(now(),'00:02:00')); insert into sequence (name,deposit_date,deposit_amount) values ('이소윤',@test,'10000000');
drop procedure if exists pro; delimiter // create procedure pro() begin while @min <30 do set @interestAmount = (select interest_amount from sequence);
if (SELECT TIMEDIFF(now(),@lastTime)) > '00:01:00' then set @lastTime = (select deposit_date from sequence where deposit_date order by id desc limit 1); set @min = minute( (SELECT TIMEDIFF(now(),@lastTime)) ); if ( @interestAmount != @interestAmount) then insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12)); end if; end if; end while; end // delimiter ;
call pro();
///////////
SELECT * FROM test.sequence;SELECT * FROM test.sequence; use test; truncate sequence; set @test = (select subtime(now(),'00:02:00')); insert into sequence (name,deposit_date,deposit_amount) values ('이소윤',@test,'10000000');
drop procedure if exists pro; delimiter // create procedure pro() begin while do set @min = minute( (SELECT TIMEDIFF(now(),(select deposit_date from sequence where deposit_date order by id desc limit 1))) ); set @interestAmount = (select interest_amount from sequence where interest_amount order by id desc limit 1);
if @min > '0' then insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12)); if ( @interestAmount != @interestAmount) then insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12)); end if;
end if; end while; end // delimiter ;
call pro();
/////////////
------------
마지막에서 1꺼
마지막에서 2한번더 들어간거!
이렇게
수정해야겠다. 왜냐면
id=2부터 이자액 들어가니까
use test; truncate sequence;
set @setTime = (select subtime(now(),'00:02:00')); insert into sequence (name,deposit_date,deposit_amount) values ('이소윤',@setTime,'10000000');
drop procedure if exists pro; delimiter // create procedure pro() begin set @min = minute((SELECT TIMEDIFF(now(), @setTime))); set i =1;
while i <= @min do set i = i +1; set @interest_amount = (select interest_amount from sequence where interest_amount order by id desc limit 2); set @Prev_interest_amount = (select interest_amount from sequence where interest_amount order by id desc limit 3);
if (@interest_amount != @Prev_interest_amount) then insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12)); end if; end while; end // delimiter ;
call pro();
흑흑 안돼...
왜 삭제 안되지?????
use test;
를 빼먹었나 그거 하고 하니까 됨
/////
여러번으 시도를 했지만 안됨..
use test; truncate sequence;
set @setTime = (select subtime(now(),'00:02:00')); select @setTime; insert into sequence (name,deposit_date,deposit_amount) values ('이소윤',@setTime,'10000000'); select * from sequence;
drop procedure if exists pro; delimiter // create procedure pro(i int) begin set @min = minute((SELECT TIMEDIFF(now(), @setTime))); select @min;
while i <= @min do set i = i +1; select i; set @interest_amount = (select interest_amount from sequence where interest_amount order by id desc limit 1); set @Prev_interest_amount = (select interest_amount from sequence where interest_amount order by id desc limit 2);
if (@interest_amount != @Prev_interest_amount) then insert into sequence (interest_amount) values (@min*(@deposit_amount*0.04/12)); end if; end while; end // delimiter ;