pymssql返回datetimeoffset的二进制数据

时间:2019-06-20 20:20:07

标签: python sql-server python-3.6 freetds pymssql

我正在使用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 trick对对吗?!?!不,那格式字符串不会让我解压值。

因此,在这一点上,我很困惑,我在做错什么,在一天结束时,我想知道为什么日期返回为二进制而不是我可以操纵的东西。

一切都告诉我这应该工作。

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题,获得了我期望的数据。

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解释二进制文件的方式。我不能使用相同的拆包格式字符串,上面的字符串可以正常工作,并且通过一些简单的数学运算就可以得出期望的值。