MS-SQL에서 돌아가던 쿼리를 MySQL에서 돌리려는데 문제가 생겨서 조언 좀 부탁드립니다... 0 2 2,156

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)

========================================================================================================

인터넷도 뒤져보고 주위사람들에게도 물어봤는데 다들 답을 주질 못해서 이렇게 글을 올립니다.

제발..불쌍한 중생에게 도움 좀 부탁드립니다..

by 마농 [2013.08.01 08:44:22]

해당 오류 말고도 전반적으로 많이 이상하네요.
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')


by 바가지 [2013.08.04 17:15:37]

일단 이상한 부분을 전부 지적해주셔서 감사합니다.
마농님께서 말씀하신 부분은 전부 수정을 해야되겠네요..;;
a.'index' 는 저도 모르겠어요..
암튼 다시 한번 감사드립니다. 날씨가 너무 더운데 건강 조심하세요^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입