목표 : 상품 주문 시 주문테이블에 들어가는 주문 코드(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()) 부분이 이해가 안간다면 아래 글 참고해주세용