在Python中运行时发生MySQL查询错误,但在直接运行时发生错误

在Python中运行时发生MySQL查询错误,但在直接运行时发生错误,python,mysql,django,Python,Mysql,Django,我正在将'2012-09-10 00:00:00-05:00'传递给一个MySQL查询。使用for 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

我正在将
'2012-09-10 00:00:00-05:00'
传递给一个MySQL查询。使用for 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);
如果我直接执行这个查询,它将按预期返回数据。如果我将此查询放入代码中,则会出现以下错误:
警告:截断的日期时间值不正确:“2012-09-09 00:00:00-05:00”

我使用的代码如下(在Django中):

我在MySQL文档中没有看到str_to_date的偏移量字符串。我更愿意保留该偏移量,因为数据是为第三方系统返回的,通过将其保留在适当的位置,我不必在返回和使用返回的日期执行查询之间进行任何逻辑操作。然而,我不认为它与偏移量有关,因为如果我直接运行它,它会工作

当Python对MySQL运行查询时,我做了哪些错误的操作会导致出现此警告?

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)

mysql的日期/时间格式不包括时区。您没有在str_to_date的格式字符串中包含该
-05:00
,因此会收到一条警告,提示该字符串被截断。警告不是错误,因此在客户端应该可以正常工作。为了在MySQL中保留时区信息,请在存储之前将所有datetime对象转换为UTC。mysql命令行客户端在出现警告时不会直接显示,它只是提示警告(
queryok,1行受影响,1条警告(0.00秒)
)。其他客户端可能会完全隐藏它们。这将删除时区信息:dt=dt_tz.replace(tzinfo=None)
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)