【问题标题】:Datetime formatting with torndb python使用 torndb python 格式化日期时间
【发布时间】:2014-01-08 10:19:58
【问题描述】:

我有一个简单的查询,可以将 VARCHAR 列转换为日期时间(我在这里提供的是一个更简化的版本来说明问题)。当直接在 mysql 中执行时,查询会按预期运行:

mysql> SELECT STR_TO_DATE('01:35 PM', '%h:%i %p') as t;
+----------+
| t        |
+----------+
| 13:35:00 |
+----------+

但是,当我在 torndb 中运行完全相同的查询时:

row = conn.get("SELECT STR_TO_DATE('01:35 PM', '%%h:%%i %%p') as t")
print ">>", row.t

我收到以下警告(使用 torndb.Connection 正确构造了 conn):

/Library/Python/2.7/site-packages/torndb.py:226: Warning: Incorrect datetime value: '01:35 PM' for function str_to_date
  return cursor.execute(query, kwparameters or parameters)
>> None

进一步查看mysqldb,似乎问题与它有关:

conn = db.connect("localhost", 'xxx')
c = conn.cursor()
c.execute("SELECT STR_TO_DATE('01:35 PM', '%%h:%%i %%p') as t")
main:1: Warning: Incorrect datetime value: '01:35 PM' for function str_to_date
1L

但是,当我删除双 %% 时,它工作正常:

c.execute("SELECT STR_TO_DATE('01:35 PM', '%h:%i %p') as t")
1L
c.fetchone()
(datetime.timedelta(0, 48900),)

不知道这里发生了什么......

【问题讨论】:

  • 显然,问题在于 torndb 传递给初始化 mysqldb 的参数 - sql_mode="TRADITIONAL"。删除它可以解决问题,但我不确定为什么会导致问题。

标签: python mysql datetime tornado mysql-python


【解决方案1】:

Torndb 开启 SQL 模式“TRADITIONAL”,这在 mysql 服务器上启用了许多选项。其中有 NO_ZERO_DATE 和 NO_ZERO_IN_DATE,它们使服务器对无效 DATE 和 DATETIME 更加严格。在这种情况下,STR_TO_DATE 应该返回一个 TIME,而不是一个 DATETIME,因此它不应该受到影响,但它看起来在内部触发了对时间戳的缺失日期部分的某种检查。这看起来像mysql中的一个错误。最简单的解决方法是不使用 TRADITIONAL 模式(或至少取消设置 NO_ZERO_IN_DATE 标志)。

【讨论】:

  • 我们可以在 torndb 中做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多