2012-09-10 131 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)