pymssql возвращает двоичные данные для datetimeoffset - PullRequest
0 голосов
/ 20 июня 2019

Я использую 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 верно-верно?!?!Нет, я не могу этого сделать, ни та строка формата не позволит мне распаковать значение.

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

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

1 Ответ

0 голосов
/ 21 июня 2019

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

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. Я не мог использовать ту же строку формата распаковки, приведенная выше строка работает, и с некоторой простой математикой это дает ожидаемое значение.

...