pymssql 正在返回 datetimeoffset 的二进制数据
pymssql is returning binary data for datetimeoffset
我正在使用 python 3.6 和 pymssql 尝试从 table 中提取一些数据。除了 datetimeoffset 列外,一切都很好。
我有一个 table,它有一个名为 DateCreated 的列,其类型为 DateTimeOffset。
此列有一组默认的 sysdatetimeoffset()
当我使用 tsql、azure data studio 和 freetds 实用程序时。他们都是return期望值。
当我使用 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 对吗?!?!不,不能那样做,要么格式字符串不允许我解压值。
所以在这一点上我很困惑,我做错了什么,在一天结束时我想知道为什么日期以二进制而不是我可以操纵的形式返回。
一切都告诉我这应该有效。
我有解决此问题的方法,它获得了我预期的数据。
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 解释二进制文件的方式。我无法使用相同的解包格式字符串,上面的字符串有效并且通过一些简单的数学运算它产生了预期的值。
我正在使用 python 3.6 和 pymssql 尝试从 table 中提取一些数据。除了 datetimeoffset 列外,一切都很好。
我有一个 table,它有一个名为 DateCreated 的列,其类型为 DateTimeOffset。
此列有一组默认的 sysdatetimeoffset()
当我使用 tsql、azure data studio 和 freetds 实用程序时。他们都是return期望值。
当我使用 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 对吗?!?!不,不能那样做,要么格式字符串不允许我解压值。
所以在这一点上我很困惑,我做错了什么,在一天结束时我想知道为什么日期以二进制而不是我可以操纵的形式返回。
一切都告诉我这应该有效。
我有解决此问题的方法,它获得了我预期的数据。
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 解释二进制文件的方式。我无法使用相同的解包格式字符串,上面的字符串有效并且通过一些简单的数学运算它产生了预期的值。