Ответ 1
В поле времени используйте:
import time
time.strftime('%Y-%m-%d %H:%M:%S')
Я думаю, что strftime также относится к datetime.
У меня есть столбец даты в таблице MySQL. Я хочу вставить объект datetime.datetime()
в этот столбец. Что я должен использовать в инструкции выполнения?
Я пробовал:
now = datetime.datetime(2009,5,5)
cursor.execute("INSERT INTO table
(name, id, datecolumn) VALUES (%s, %s
, %s)",("name", 4,now))
Я получаю сообщение об ошибке: "TypeError: not all arguments converted during string formatting"
Что следует использовать вместо %s
?
В поле времени используйте:
import time
time.strftime('%Y-%m-%d %H:%M:%S')
Я думаю, что strftime также относится к datetime.
Скорее всего, вы получаете TypeError, потому что вам нужны котировки вокруг значения datecolumn.
Try:
now = datetime.datetime(2009, 5, 5)
cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, '%s')",
("name", 4, now))
Что касается формата, у меня был успех с указанной командой (которая включает миллисекунды) и с:
now.strftime('%Y-%m-%d %H:%M:%S')
Надеюсь, что это поможет.
Попробуйте использовать now.date()
, чтобы получить объект Date
, а не DateTime
.
Если это не сработает, то преобразование этого в строку должно работать:
now = datetime.datetime(2009,5,5)
str_now = now.date().isoformat()
cursor.execute('INSERT INTO table (name, id, datecolumn) VALUES (%s,%s,%s)', ('name',4,str_now))
В какую базу данных вы подключаетесь? Я знаю, что Oracle может быть придирчивым к форматам дат и нравится ISO 8601.
** Примечание: Ой, я просто прочитал, что вы на MySQL. Просто отформатируйте дату и попробуйте ее как отдельный прямой вызов SQL для тестирования.
В Python вы можете получить дату ISO, например
now.isoformat()
Например, Oracle любит даты типа
insert into x values(99, '31-may-09');
В зависимости от вашей базы данных, если это Oracle, вам может понадобиться TO_DATE:
insert into x
values(99, to_date('2009/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam'));
Общее использование TO_DATE:
TO_DATE(<string>, '<format>')
Если вы используете другую базу данных (я видел курсор и думал о Oracle, я мог ошибаться), тогда проверьте их инструменты формата даты. Для MySQL это DATE_FORMAT() и SQL Server - это CONVERT.
Также с помощью такого инструмента, как SQLAlchemy, удаляются такие различия и облегчаются жизнь.
Используйте метод Python datetime.strftime(format)
, где format = '%Y-%m-%d %H:%M:%S'
.
import datetime
now = datetime.datetime.utcnow()
cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, %s)",
("name", 4, now.strftime('%Y-%m-%d %H:%M:%S')))
Если часовые пояса являются проблемой, часовой пояс MySQL может быть установлен для UTC следующим образом:
cursor.execute("SET time_zone = '+00:00'")
И часовой пояс может быть установлен в Python:
now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
MySQL распознает значения DATETIME и TIMESTAMP в следующих форматах:
В виде строки в формате "YYY Y- ММ-ДД ЧЧ: ММ: СС" или "Y Y- ММ-ДД ЧЧ: ММ: СС". Здесь также разрешен "смягченный" синтаксис: любой символ пунктуации может использоваться в качестве разделителя между частями даты или частями времени. Например, "2012-12-31 11:30:45", "2012 ^ 12 ^ 31 11 + 30 + 45", "2012/12/31 11 * 30 * 45" и "2012 @12 @31 11". ^ 30 ^ 45 'эквивалентны.
Единственный разделитель, распознаваемый между частью даты и времени и частью доли секунды, - это десятичная точка.
Части даты и времени могут быть разделены T, а не пробелом. Например, '2012-12-31 11:30:45' 2012-12-31T11: 30: 45 'эквивалентны.
Как строка без разделителей в формате "ГГГГММДДЧЧММСС" или "ГГММДДЧЧММСС", при условии, что строка имеет смысл как дата. Например, "20070523091528" и "070523091528" интерпретируются как "2007-05-23 09:15:28", но "071122129015" является недопустимым (имеет бессмысленную мелкую часть) и становится "0000-00-00 00: 00:00'.
Как число в формате ГГГГММДДЧЧММСС или ГГММДДЧЧММСС, при условии, что число имеет смысл как дата. Например, 19830905132800 и 830905132800 интерпретируются как "1983-09-05 13:28:00".
Если вы просто используете python datetime.date (не полный datetime.datetime), просто приведите дату в виде строки. Это очень просто и работает для меня (MySQL, Python 2.7, Ubuntu). Колонка published_date
является полем данных MySQL, питон переменной publish_date
является datetime.date
.
# make the record for the passed link info
sql_stmt = "INSERT INTO snippet_links (" + \
"link_headline, link_url, published_date, author, source, coco_id, link_id)" + \
"VALUES(%s, %s, %s, %s, %s, %s, %s) ;"
sql_data = ( title, link, str(publish_date), \
author, posted_by, \
str(coco_id), str(link_id) )
try:
dbc.execute(sql_stmt, sql_data )
except Exception, e:
...
при переходе в t-sql
это терпит неудачу:
select CONVERT(datetime,'2019-09-13 09:04:35.823312',21)
это работает:
select CONVERT(datetime,'2019-09-13 09:04:35.823',21)
простой способ:
regexp = re.compile(r'\.(\d{6})')
def to_splunk_iso(dt):
"""Converts the datetime object to Splunk isoformat string."""
# 6-digits string.
microseconds = regexp.search(dt).group(1)
return regexp.sub('.%d' % round(float(microseconds) / 1000), dt)