pymysql 에러

조회수 430회

다음과 같은 sql 전문이 에러가 납니다.

"Select Price_Div.Ticker, Price_Div.Date, Price_Div.Price_Div from Price_Div where ((Price_Div.Ticker in ('000080 KS Equity', '001530 KS Equity', '001750 KS Equity', '002960 KS Equity', '003000 KS Equity', '003540 KS Equity', '003545 KS Equity', '003720 KS Equity', '004150 KS Equity', '005010 KS Equity', '005945 KS Equity', '005960 KS Equity', '006805 KS Equity', '006840 KS Equity', '007370 KS Equity', '008730 KS Equity', '009200 KS Equity', '009835 KS Equity', '010960 KS Equity', '014190 KS Equity', '014470 KS Equity', '014530 KS Equity', '016610 KS Equity', '017670 KS Equity', '018120 KS Equity', '023900 KS Equity', '029530 KS Equity', '030200 KS Equity', '030790 KS Equity', '032640 KS Equity', '033780 KS Equity', '034230 KS Equity', '036640 KS Equity', '040420 KS Equity', '041650 KS Equity', '042700 KS Equity', '049770 KS Equity', '052860 KS Equity', '054040 KS Equity', '065690 KS Equity', '075130 KS Equity', '078935 KS Equity', '084670 KS Equity', '092440 KS Equity', '095340 KS Equity', '095720 KS Equity', '101930 KS Equity', '115310 KS Equity', '120115 KS Equity', '131180 KS Equity')) and (2011-04-01 00:00:00 <=Price_Div.Date<= 2011-05-01 00:00:00)) order by Price_Div.Date, Price_Div.Ticker"

(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '00:00:00 and 2011-05-01 00:00:00)) order by Price_Div.Date, Price_Div.Ticker' at line 1")

코드는 다음과 같습니다.

try:
    with conn.cursor() as cursor:

        sql = """Select Price_Div.Ticker, Price_Div.Date, Price_Div.Price_Div from Price_Div where ((Price_Div.Ticker in ' + str(tuple(Portfolioset[i])) + ') and ('+ str(Datelist[i]) + ' <=Price_Div.Date<= '+ str(Datelist[i+1])+')) order by Price_Div.Date, Price_Div.Ticker"""
        cursor.execute(sql)
        rows3 = cursor.fetchall()

    conn.commit()

finally:

    conn.close() 

날짜에 부등호 써서 에러가 난 것일까요?

  • 코드는 붙여넣기 전에 들여쓰기와 줄 바꿈을 정리해서 올리는게 답변자를 위한 배려랍니다. (쿼리도 에러 로그도 코드입니다) 편집요청빌런 2020.4.16 14:57

1 답변

  • 날짜값 2011-04-01 00:00:00, 2011-05-01 00:00:00을 따옴표로 감싸도록 작성해보세요.


    위 문제는 해결하더라도 만약 Price_Div.Date의 데이터 타입이 datetime이면 비교가 제대로 안될겁니다. (datetime이 아니라 varchar면 그건 그것대로 문제지만...)

    그러니까 인풋에 해당하는 날짜값을 datetime으로 변경하세요. MySql에는 DATE_FORMAT, STR_TO_DATE 함수가 있습니다.

    • 셋 다 타입은 Datetime입니다. magic0111 2020.4.16 15:05
    • datetime.datetime(2011, 4, 1, 0, 0) 그리고 datetime.datetime(2011, 5, 1, 0, 0) 그리고 column type은 datetime입니다. magic0111 2020.4.16 15:05
    • 답변에서 언급한것처럼 입력된 날짜값 문자열을 datetime으로 변환하도록 쿼리를 만들어보세요. 편집요청빌런 2020.4.16 15:07
    • "Select Price_Div.Ticker, Price_Div.Date, Price_Div.Price_Div from Price_Div where ((Price_Div.Ticker in ('000080 KS Equity', '001530 KS Equity', '001750 KS Equity', '002960 KS Equity', '003000 KS Equity', '003540 KS Equity', '003545 KS Equity', '003720 KS Equity', '004150 KS Equity', '005010 KS Equity', '005945 KS Equity', '005960 KS Equity', '006805 KS Equity', '006840 KS Equity', '007370 KS Equity', '008730 KS Equity', '009200 KS Equity', '009835 KS Equity', '010960 KS Equity', '014190 KS Equity', '014470 KS Equity', '014530 KS Equity', '016610 KS Equity', '017670 KS Equity', '018120 KS Equity', '023900 KS Equity', '029530 KS Equity', '030200 KS Equity', '030790 KS Equity', '032640 KS Equity', '033780 KS Equity', '034230 KS Equity', '036640 KS Equity', '040420 KS Equity', '041650 KS Equity', '042700 KS Equity', '049770 KS Equity', '052860 KS Equity', '054040 KS Equity', '065690 KS Equity', '075130 KS Equity', '078935 KS Equity', '084670 KS Equity', '092440 KS Equity', '095340 KS Equity', '095720 KS Equity', '101930 KS Equity', '115310 KS Equity', '120115 KS Equity', '131180 KS Equity')) and (Price_Div.Date between STR_TO_DATE(2011-04-01 00:00:00, %Y-%m-%d %H:%M:%S) and STR_TO_DATE(2011-05-01 00:00:00, %Y-%m-%d %H:%M:%S))) order by Price_Div.Date, Price_Div.Ticker magic0111 2020.4.16 15:12
    • 잘 하셨네요. 그걸 DBMS 툴에서 돌려보고 이상 없으면 코드로 만들면 됩니다. 편집요청빌런 2020.4.16 15:22
    • 해결되었습니다. 감사합니다! magic0111 2020.4.16 15:29

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)