【问题标题】:MySQL Query error when run within Python but not when run directly在 Python 中运行但直接运行时不会出现 MySQL Query 错误
【发布时间】:2012-09-10 15:51:51
【问题描述】:

我将 '2012-09-10 00:00:00-05:00' 传递给 MySQL 查询。使用 Python 的 pytz module 检索此值。

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)

todaystart 被替换后,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);

如果我直接执行这个查询,它会按预期返回数据。如果我将此查询放入代码中,则会出现此错误: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 文档中看到 str_to_date 的偏移量 format 字符串。我宁愿保留该偏移量,因为数据是为第 3 方系统返回的,并且通过将其保留在适当的位置,我不必在该返回和使用返回日期执行查询之间执行任何逻辑。但是,我认为它与偏移量无关,因为如果我直接运行它就可以工作。

当 Python 对 MySQL 运行查询时,我做错了什么会导致 Warning 出现?

【问题讨论】:

  • mysql 的日期/时间格式不包括时区。您尚未在 str_to_date 的格式字符串中包含 -05:00,因此您会收到字符串被截断的警告。警告不是错误,因此它应该在您的客户端中正常工作。
  • 为了在 MySQL 中保留时区信息,请在存储之前将所有 datetime 对象转换为 UTC。 mysql 命令行客户端在发生警告时不会直接显示警告,它只是提示它们(Query OK, 1 row affected, 1 warning (0.00 sec))。其他客户端可能会完全隐藏它们。
  • 这应该删除时区信息:dt = dt_tz.replace(tzinfo=None)

标签: python mysql django


【解决方案1】:

马克 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2010-10-13
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2018-01-25
    相关资源
    最近更新 更多