【问题标题】:pymssql is returning binary data for datetimeoffsetpymssql 正在返回 datetimeoffset 的二进制数据
【发布时间】:2019-11-03 17:03:00
【问题描述】:

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

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

一切都告诉我这应该有效。

【问题讨论】:

  • 您能否添加更多有关如何保存日期的详细信息?
  • 它们是由 sysdatetimeoffset 作为默认更新问题自动生成的
  • 如果还有什么我可以提供的,请告诉我

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


【解决方案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 解释二进制文件的方式。我不能使用相同的解包格式字符串,上面的字符串可以工作,并且通过一些简单的数学运算它会产生预期值。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 2015-04-01
  • 2015-07-24
相关资源
最近更新 更多