вставка даты и времени с микросекундами в SQL Server из python - PullRequest
0 голосов
/ 26 сентября 2018

Код ниже работает отлично:

import pypyodbc
import datetime

connection = pypyodbc.connect('Driver={SQL Server};'
    'Server=some_server;'
    'Database=some_db')
cur = connection.cursor()
some_time = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
query = "insert into table_a (date_created) values ('"+some_time+"')"
cur.execute(query)
connection.commit()
connection.close()

Но если я изменяю (добавляя микросекунды к дате)

some_time = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')

, он генерирует ошибку:

DataError: ('22007', '[22007] [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting date and/or time from character string.')

*Столбец 1010 * имеет тип datetime и отображает микросекунды.

Есть мысли?

1 Ответ

0 голосов
/ 28 сентября 2018

SQL Server datetime столбцы могут хранить только доли секунды с точностью до миллисекунда (3 знака после запятой).Когда вы делаете

some_time = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')

, вы получаете строку, отформатированную с точностью до Python datetime, которая составляет микросекунды (6 десятичных знаков)

>>> some_time
'2018-09-28 16:38:14.344801'

, а SQL-сервер не любитдополнительные три знака после запятой.

Решение состоит в том, чтобы не форматировать datetime в виде строки, просто передайте само значение datetime в собственном параметризованном запросе

query = "insert into table_a (date_created) values (?)"
params = (datetime.datetime.utcnow(), )
cur.execute(query, params)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...