DataBase_SQL
[mySQL 사용자 정의 함수] 오늘 날짜를 이용해 기본키 값 생성 함수(ex 주문코드 등...), mySQL insert function
Jjiveloper
2021. 5. 2. 01:39
728x90
목표 : 상품 주문 시 주문테이블에 들어가는 주문 코드(pk)를 yyyyddyy-count() 이런 형식으로 만들고 싶었음
아래 코드는 문제가 있으니 참고만 해주세용~~
USE `사용중인DB명`; -- 생략 가능
DROP function IF EXISTS `사용중인DB명`.`CREATE_OCODE_FC`; -- 기존에 함수 있으면 지우고 다시 만듦
DELIMITER $$
CREATE FUNCTION `CREATE_OCODE_FC`()
RETURNS char(13)
BEGIN
DECLARE _count INT DEFAULT 0; -- 오늘 날짜에 해당하는 주문 건수를 가져오기 위함
DECLARE _ocode CHAR(13); -- 반환할 주문 코드 총 13자리
SET _count = ( SELECT COUNT(*)+1 FROM orderDetail WHERE DATE(odate) = DATE(now()) ); -- DATE()로 감싸줘야 년일월만 비교해옴
SET _ocode = CONCAT( DATE_FORMAT(NOW(),'%Y%m%d%w'), '-', LPAD(_count,4,0) ); -- '%Y%m%d' : yyyymmdd, '%w' -> 요일 숫자로 표현 (일요일:0 ~ 6)
RETURN _ocode;
END$$
DELIMITER ;
분명히 _count 값에 들어가는 값 (SELECT ~ DATE(now())); 까지의 값을 SQL에서 조회했을 땐 정상적으로 조회가 되었다.
근데 막상 함수에 넣고 쓰려고하니까 결과가 이상했다.
(오늘 날짜가 2021년 5월 2일이고, 오늘 첫 주문이라 가정)
기대 결과 : 202105020-0001
실행 결과 : 202105020-000
?? count 결과값이 없어졌다.... 어디갔뉴...ㅠㅠ
예측으로는 변수는 LPAD()가 적용안되는 것 같았다.
그래서 다시 쌩으로 LPAD() 안에 COUNT(*)해오기로 했다...
정상 작동하는 함수 코드
USE `사용중인DB명`;
DROP function IF EXISTS `사용중인DB명`.`CREATE_OCODE_FC`;
;
DELIMITER $$
USE `사용중인DB명`$$
CREATE FUNCTION `CREATE_OCODE_FC`()
RETURNS char(13)
BEGIN
DECLARE _ocode CHAR(13);
SET _ocode = CONCAT(
DATE_FORMAT(NOW(),'%Y%m%d%w'), -- '%Y%m%d' : yyyymmdd, '%w' -> 요일 숫자로 표현 (일요일:0 ~ 6)
'-',
LPAD(
(
SELECT COUNT(*)+1 FROM orderDetail
WHERE DATE(odate) = DATE( NOW() ) -- DATE()로 감싸줘야 년일월만 비교해옴
),
4, -- 총 4칸을 채울건데 4칸이 안되면 다음 문자로 채운다.
0 -- 채울 문자는 0
)
);
RETURN _ocode;
END$$
DELIMITER ;
;
이왕 이렇게 된김에 가독성이라도 높이려고 노력해봤음...
기대 결과 : 202105020-0001
실행 결과 : 202105020-0001
완성~~~
DATE(odate) = DATE(NOW()) 부분이 이해가 안간다면 아래 글 참고해주세용
[mySQL 특정 날짜 조회] mySQL 날짜만 비교해서 해당 날짜에 해당하는 값 조회하기
mySQL에서 DATE 타입을 저장할 때 년도, 월, 일, 시, 분, 초 까지 저장하는 경우가 많을 것이다. (default를 NOW()로 때리면 저렇게 저장됨 → ex) 2020-05-05 01:43:00 ) 그래서 특정 날짜에 대해서 조회를 하고.
xively.tistory.com
728x90
반응형