我正在使用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对对吗?!?!不,那格式字符串不会让我解压值。
因此,在这一点上,我很困惑,我在做错什么,在一天结束时,我想知道为什么日期返回为二进制而不是我可以操纵的东西。
一切都告诉我这应该工作。
答案 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解释二进制文件的方式。我不能使用相同的拆包格式字符串,上面的字符串可以正常工作,并且通过一些简单的数学运算就可以得出期望的值。