상세 컨텐츠

본문 제목

[mySQL 사용자 정의 함수] 오늘 날짜를 이용해 기본키 값 생성 함수(ex 주문코드 등...), mySQL insert function

DataBase_SQL

by 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()) 부분이 이해가 안간다면 아래 글 참고해주세용

xively.tistory.com/29

 

[mySQL 특정 날짜 조회] mySQL 날짜만 비교해서 해당 날짜에 해당하는 값 조회하기

mySQL에서 DATE 타입을 저장할 때 년도, 월, 일, 시, 분, 초 까지 저장하는 경우가 많을 것이다. (default를 NOW()로 때리면 저렇게 저장됨 → ex) 2020-05-05 01:43:00 ) 그래서 특정 날짜에 대해서 조회를 하고.

xively.tistory.com

 

728x90
반응형

관련글 더보기