2015-12-18 39 views
0

雖然試圖執行我的Python腳本,我面對這些類型轉換錯誤:字符串/ Int的類型鑄造日期蟒蛇

historical_start_date = '2015-12-01' 
historical_end_date = '2015-12-31' 
caldate = 2015-12-10 ## this is date type 

sql_str = """SELECT ART_TYPE as ART_TYPE, 
           year(event_dt) * 100 + month(event_dt) as year_month, 
           sum(measured_quantity) 
           FROM <tablename> 
           WHERE EVENT_DT>=to_date('{1}','YYYY-MM-DD')""" 
     if historical_end_date > caldate.strftime('%Y-%m-%d'): 
       sql_str= sql_str+ " AND EVENT_DT<" +caldate.strftime('%Y-%m-%d') 
     else: 
       sql_str= sql_str+ " AND EVENT_DT <= to_date('{2}','YYYY-MM-DD') " 
     sql_str= sql_str+ """ GROUP BY ART_TYPE,year(event_dt) * 100 + month(event_dt)""".format(historical_start_date,historical_end_date) 

在運行,我得到了以下錯誤:

('42883', '[42883] ERROR 4286: Operator does not exist: date < int\nHINT: No operator matches the given name and argument type(s). You may need to add explicit type casts\n (4286) (SQLExecDirectW)') 
+0

聽起來你要比較的日期與時間的'int'表示了'varchar'表示。確保您的數據類型匹配:將類型轉換爲其他類型。 – openwonk

+0

在上面的代碼中,我嘗試使用caldate.strftime('%Y-%m-%d')將字符串caldate轉換爲字符串。這是正確的做法嗎?我嘗試了其他方法來使數據類型在「=」的兩側相等。你能提供一些轉換(語法)的例子:str,str到date,int到date –

+0

@Adriano,我已經在整個sql_str的結尾給出了.format。我應該爲sql_str中的每個字符串添加format(),其中有一個參數{0}。另外我會嘗試按名稱使用{something} –

回答

0

在:

if historical_end_date > caldate.strftime('%Y-%m-%d'): 

它看起來像你比較兩個字符串。 Python中的Comparing strings與比較時間不一樣。嘗試對日期時間進行類型轉換,以確保您比較的是要比較的內容。

我說用strptime()方法:

from datetime import datetime 
hist_end_dt = datetime.strptime(historical_end_date,'%Y-%m-%d') 
caldate_dt = datetime.strptime(caldate,'%Y-%m-%d') 
if hist_end_dt > caldate_dt: 
    #do whatever you need to do 
+0

@ciaciode:我嘗試使用strptime()方法,但我得到的錯誤是來自datetime的datetime對象無法訪問。我正在使用import語句s:import datetime \ n –

+0

我的錯誤@UdayShankar。導入聲明應該與我工作的例子不同。我將編輯答案。讓我知道這是否有效。 – ciacicode

+0

我不得不使用兩個導入語句:導入日期時間和從日期時間導入日期時間,因爲我收到一個錯誤,即日期時間內的日期時間無法訪問。有沒有解決方法? –