by 똑똑 [DB 기타] [2021.04.26 17:41:35]
SELECT * FROM ( SELECT (ROW_NUMBER() OVER(ORDER BY A.TOP_YN, A.IDX_NO) ) AS NO, (ROW_NUMBER() OVER(ORDER BY A.TOP_YN DESC, A.IDX_NO DESC)) AS RN, A.BOARD_TYPE, A.IDX_NO, A.TITLE, A.CONTENT, A.VIEW_CNT, A.CLS_GB1, A.CLS_GB2, A.CLS_GB3, (SELECT CODE_NM FROM IMS_CODE_MST WHERE CODE=A.CLS_GB1) as CLS_GB1_NM, (SELECT CODE_NM FROM IMS_CODE_MST WHERE CODE=A.CLS_GB2) as CLS_GB2_NM, (SELECT CODE_NM FROM IMS_CODE_MST WHERE CODE=A.CLS_GB3) as CLS_GB3_NM, A.TOP_YN, A.PUBLIC_YN, A.DEL_YN, (SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END FROM COM_BOARD_FILE B WHERE B.IDX_NO = A.IDX_NO AND B.BOARD_TYPE = A.BOARD_TYPE AND B.DEL_YN='N') AS FILE_YN, TO_CHAR(A.FROM_POSTDATE, 'YYYY-MM-DD') AS FROM_POSTDATE, TO_CHAR(A.TO_POSTDATE, 'YYYY-MM-DD') AS TO_POSTDATE, A.MESSENGER_YN, A.MESSENGER_TIME, A.CREATE_ID, A.CREATE_DATE, A.UPDATE_ID, A.UPDATE_DATE FROM COM_BOARD A WHERE A.BOARD_TYPE = 'BOARD_TYPE_001' AND A.DEL_YN = 'N' AND A.PUBLIC_YN = 'PUBLIC_YN_001' AND (A.FROM_POSTDATE <= TO_CHAR(SYSDATE,'YYYY-MM-DD') AND A.TO_POSTDATE >= TO_CHAR(SYSDATE,'YYYY-MM-DD')) ) ;
안녕하세요. 여러 방법을 찾아보다가 원인 파악이 되지가 않아서 글을 남깁니다.
해당 쿼리는 로컬 서버에서는 잘 작동이 됩니다.
그러나 실서버에서 해당 쿼리를 적용하면 경우 ORA-01861: literal does not match format string 에러가 나옵니다.
이상한 점은 실 서버에서 날짜 포맷을 빼고 돌리면 동작은 한다는 것입니다.
날짜 관련된 설정에 문제가 있는 것일까요?
날짜 컬럼의 자료형이 뭔가요?
해당 자료형에 맞는 쿼리를 사용해야 합니다.
날짜가 필요한 곳엔 날짜를 사용해야 하고, 문자가 필요한 곳엔 문자를 사용해야 합니다.
날짜가 필요한 곳에 문자를 사용하거나, 문자가 필요한 곳에 날짜를 사용한다면? 에러가 날 수 있습니다.
1. A.TO_POSTDATE >= TO_CHAR(SYSDATE,'YYYY-MM-DD')
2. TO_CHAR(A.TO_POSTDATE, 'YYYY-MM-DD') AS TO_POSTDATE
1번 구문을 보면 해당 항목을 문자와 비교합니다. -> 해당 항목이 문자 타입 일까요? -> 날짜 타입이라면 틀린 구문입니다.
2번 구문을 보면 해당 항목을 문자로 변환합니다. -> 해당 항목이 날짜 타입 일까요? -> 문자 타입이라면 틀린 구문입니다.
같은 항목인데 다르게 사용하고 있습니다. 둘 중 하나는 틀린 구문이죠.
문자라면 문자답게 사용해야 하고 날짜라면 날짜답게 사용해야 합니다.
문자를 날짜처럼 사용하거나 날짜를 문자처럼 사용하면 오류가 발생됩니다.