2014-01-07 3 views
1

У меня есть простой запрос, который преобразует столбец VARCHAR в datetime (тот, который я предоставляю здесь, представляет собой даже упрощенную версию, которая иллюстрирует проблему). При выполнении непосредственно в MySQL запрос выполняется, как ожидалось:Форматирование даты и времени с torndb python

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. Подключение):

/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),) 

Не уверен, что здесь происходит ...

+0

По-видимому, проблема заключается в аргументе torndb pass для инициализации mysqldb - sql_mode = "TRADITIONAL". Удаление этой проблемы решает проблему, но я не уверен, почему это вызывает проблему. – udiw

ответ

0

Torndb включается режим SQL "традиционный", который позволяет несколько вариантов на сервере mysql. Среди них NO_ZERO_DATE и NO_ZERO_IN_DATE, что делает сервер более строгим в отношении недопустимых DATE и DATETIME. В этом случае STR_TO_DATE должен возвращать TIME, а не DATETIME, поэтому он не должен быть затронут, но он выглядит как внутренне, он вызывает какую-то проверку на отсутствующей части даты метки времени. Это похоже на ошибку в mysql. Простейшим обходным решением является использование режима TRADITIONAL (или, по крайней мере, для отмены отметки NO_ZERO_IN_DATE).

+0

можем ли мы сделать это в torndb? – udiw

Смежные вопросы