pymssql возвращает двоичные данные для datetimeoffset

Я использую python 3.6 и pymssql, чтобы попытаться извлечь данные из таблицы. все нормально, кроме столбцов datetimeoffset.

У меня есть таблица, в которой есть столбец DateCreated с типом DateTimeOffset.

этот столбец имеет набор по умолчанию sysdatetimeoffset ()

Когда я использую tsql, azure data studio и утилиты freetds. все они возвращают ожидаемое значение.

когда я использую скрипт python, по сути это

import pymssql


username = 'myusername'
pw = 'mypw'
server = 'myserver'
db = 'mydb'

c = pymssql.connect(server,username,pw,db)
cur = c.cursor()

cur.execute('select DateCreated from myTable where DateCreated and id = 2')

r = cur
for x in r:
    print (x)
    #print (struct.calcsize(data))
    #print (data.decode("utf-8"))
    break

ожидаемые данные будут выглядеть примерно так 2019-06-20 09: 54: 40.09550 -04: 00

что я получаю

b'\x00.,x\x82\x00\x00\x00p\xaa\x00\x00\x10\xff\x07\xe0'

отличный двоичный файл, я могу распаковать это ... подождите, я не могу ... Я могу использовать трюк с pyodbc правильно ПРАВИЛЬНО?!?! нет, я не могу этого сделать, либо эта строка формата не позволит мне распаковать значение.

Итак, на данный момент я в тупике, что я делаю не так, в конце дня я хочу знать, почему даты возвращаются как двоичные, а не что-то, чем я могу манипулировать.

Все говорят мне, что это должно сработать.


person ttallierchio    schedule 20.06.2019    source источник
comment
Не могли бы вы добавить более подробную информацию о том, как вы сохраняете даты?   -  person ParthS007    schedule 20.06.2019
comment
они автоматически генерируются sysdatetimeoffset в качестве вопроса обновления по умолчанию   -  person ttallierchio    schedule 20.06.2019
comment
Если есть что-то еще, что я могу предоставить, пожалуйста, дайте мне знать   -  person ttallierchio    schedule 20.06.2019


Ответы (1)


У меня есть способ решить эту проблему, и я получил ожидаемые данные.

from datetime import datetime,timezone,timedelta
from dateutil.tz import tzoffset
import struct 

unpacked = struct.unpack('QIhH',x.DateCreated)
m = []
for tup in unpacked:
    m.append(tup)

print(m)

days= m[1]
microseconds = m[0] /10 if m[0] else 0

timezone = m[2]
tz = tzoffset('ANY',timezone * 60  )
print (tz)
my_date = datetime(*[1900,1,1,0,0,0],tzinfo=tz)
td = timedelta(days=days,minutes=m[2],microseconds=microseconds)
my_date += td
print(my_date)

Проблема заключалась в том, как двоичный файл интерпретируется pymssql по сравнению с pyodbc. Я не мог использовать ту же строку формата распаковки, указанная выше строка работает и с помощью некоторой простой математики дает ожидаемое значение.

person ttallierchio    schedule 21.06.2019
comment
В моем случае было лучшее решение: stackoverflow.com/a/52451469/2278511 + установить драйвер ODBC из: docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/ - person lukassliacky; 10.09.2020
comment
@lukassliacky, именно к этому мы и подошли в этом вопросе. возникли разногласия по поводу драйверов, и мы должны были определить, какой из них имеет наибольшую поддержку / лучшую пропускную способность и т. д., это решение, просто чтобы все знали, следует обесценить, так как больше нет причин использовать pymssql. github.com/pymssql/pymssql/issues/668 - person ttallierchio; 10.09.2020