2012-09-10 166 views
4

我正在將'2012-09-10 00:00:00-05:00'傳遞給MySQL查詢。使用Python的pytz module檢索此值。MySQL在Python中運行時發生查詢錯誤,但在直接運行時沒有發生錯誤

import pytz 
class MyClass(): 
    def __init____(self): 
     self.tz = pytz.timezone(settings.TIME_ZONE) 
     todaystart = self.tz.localize(datetime.now(self.tz).replace(hour=0, minute=0, second=0, microsecond=0, tzinfo=None), is_dst=None).astimezone(self.tz) 

MySQL查詢是這樣的,todaystart已被取代後:

SELECT * FROM mytable WHERE created > UNIX_TIMESTAMP(STR_TO_DATE('2012-09-10 00:00:00-05:00','%Y-%m-%d %k:%i:%s') - INTERVAL 1 DAY); 

如果我直接執行這個查詢,按預期的方式返回數據。如果我把這個查詢轉換成代碼它給這個錯誤:Warning: Truncated incorrect datetime value: '2012-09-09 00:00:00-05:00'

我使用的代碼是這樣的(內的Django):

query = """SELECT * FROM mytable WHERE created > UNIX_TIMESTAMP(STR_TO_DATE('2012-09-10 00:00:00-05:00','%Y-%m-%d %k:%i:%s') - INTERVAL 1 DAY);""" 
myCursor = connections[system_db].cursor() 
results = myCursor.execute(query) # Dies on this statement 
resultcount = results.fetchall() 

我沒有看到在MySQL的文檔進行偏移format串STR_TO_DATE。我寧願保留該偏移量,因爲數據是爲第三方系統返回的,並且保持原樣,所以我不必在返回和執行查詢之間執行任何邏輯與返回的日期。但是,我不認爲它與偏移量有關,因爲它可以直接運行它。

我做了什麼不正確的事情會導致這個Warning在Python對MySQL運行查詢時出現?

+4

MySQL的日期/時間格式不包括時區。您未在str_to_date的格式字符串中包含'-05:00',因此您會收到一條警告,提示該字符串已被截斷。警告不是一個錯誤,所以它應該在你的客戶中正常工作。 –

+1

爲了在MySQL中保留時區信息,請在存儲它們之前將所有日期時間對象轉換爲UTC。 mysql命令行客戶端在它們發生時並不直接顯示警告,它只是提示它們('Query OK,1 row affected,1 warning(0.00 sec)')。其他客戶可能完全隱藏它們。 – Simon

+0

這應該刪除時區信息:dt = dt_tz.replace(tzinfo =無) – user984003

回答

0

Marc B說得對。

當直接執行,你得到的警告,但可能不會注意到:

mysql> SELECT * FROM mytable WHERE created > UNIX_TIMESTAMP(STR_TO_DATE('2012-09-10 00:00:00-05:00','%Y-%m-%d %k:%i:%s') - INTERVAL 1 DAY); 
Empty set, 3 warnings (0.00 sec) 

mysql> show warnings; 
+---------+------+----------------------------------------------------------------------+ 
| Level | Code | Message                | 
+---------+------+----------------------------------------------------------------------+ 
| Warning | 1292 | Truncated incorrect datetime value: '2012-09-10 00:00:00-05:00'  | 
| Warning | 1292 | Truncated incorrect datetime value: '2012-09-10 00:00:00-05:00'  | 
| Warning | 1292 | Incorrect datetime value: '1347148800' for column 'created' at row 1 | 
+---------+------+----------------------------------------------------------------------+ 
3 rows in set (0.00 sec)