by 바가지 [MySQL] [2013.07.31 23:48:26]
제가 MySQL을 사용하는 시스템 운영을 맡게 됐는데 기존에 MS-SQL에서 돌리던 쿼리를 실행할려는데 문제가 생겨서 조언 좀 부탁드립니다..
일단 쿼리는 지난 6월 한달간 토요일, 일요일을 제외한 접속정보를 가져오는 쿼리 인데요.
SELECT SUM(CASE WHEN CAST(tl.c_time AS CHAR(8)) NOT IN ('20130601',
'20130602',
'20130608',
'20130609',
'20130615',
'20130616',
'20130622',
'20130623',
'20130629',
'20130630')
AND DATEPART(hh, tl.c_time) BETWEEN '9' AND '20' THEN 1 END ) A2
FROM (
SELECT a.clt_ip, a.ldap_name, a.server_port, a.server_ip, a.id
FROM dbsafer_log_2013_06.db_user_01 a
LEFT JOIN dbsafer_log_2013_06.db_query_01 b ON b.u_index=a.'index'
WHERE server_ip IN('172.20.89.161','172.20.89.162','172.20.89.163')
GROUP BY a.clt_ip, a.ldap_name, a.server_port, a.server_ip, a.id
) tl
WHERE tl.server_ip IN ('172.20.89.161','172.20.89.162','172.20.89.163')
AND tl.c_time > '2013-06-01' AND tl.c_time '2013-06-30'
GROUP BY tl.server_ip
기존 쿼리가 CAST() 함수 부분이 CONVERT() 함수여서 MS-SQL에서만 돌아가고 MySQL에서는 안돌아가길래 CAST() 함수로 바꿔서 형변환을 해줬는데, 문제되는 부분이 DATEPART() 함수 부분에서 아래와 같이 에러가 나더라구요..
========================================================================================================
Error Code : 1558
Column count of mysql.proc is wrong. Expected 20, found 16. Created with MySQL 50045, now running 50163.
Please use mysql_upgrade to fix this error.
(0 ms taken)
========================================================================================================
인터넷도 뒤져보고 주위사람들에게도 물어봤는데 다들 답을 주질 못해서 이렇게 글을 올립니다.
제발..불쌍한 중생에게 도움 좀 부탁드립니다..
해당 오류 말고도 전반적으로 많이 이상하네요.
1. c_time 이라는 항목이 인라인뷰 t1 안에 없네요.
- 인라인뷰 밖에서 없는 항목을 버젓이 사용하고 있네요
2. 인라인뷰 안에서 Group by 는 왜 하는거죠?
- 집계함수를 전혀 사용하지 않았는데. 왜 Group by 를?
- 중복제거용인가요?
3. a.'index' 이건 뭐죠?
- 따옴표를 저렇게 쓰진 못할듯 한데요.
4. DATEPART(hh, tl.c_time) BETWEEN '9' AND '20'
- 시간을 가져오려면 HOUR(c_time) 하시면 되구요
- 비교는 문자로 하시면 안되요. 따옴표 빼세요
5. CAST(tl.c_time AS CHAR(8)) NOT IN ( '20130601'
- 휴일제외는 WeekDay 함수를 이용하세요
- WEEKDAY(c_date) NOT IN ('5', '6')