gpt4 book ai didi

python - 使用 pyodbc 时,SQL Server DateTimeOffset 将 tz 感知日期时间的偏移量更改为系统偏移量

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:58 25 4
gpt4 key购买 nike

我在将时区感知日期时间从 python 上传到 SQL Server 数据类型 datetimeoffset 时遇到问题。

无论上传到哪个时区的SQL Server,它总是显示系统时间偏移量中的偏移量。它不会仅通过更改偏移量来转换实际日期时间。

    datetime = datetime.datetime.now(tz=pytz.timezone('UTC'))
timeString = datetime.strftime("%Y-%m-%d %H:%M:%S%z")
timeData = {'datetimeOFFSET':datetime, 'datetime':datetime, 'datetimeString':timeString}
df = pd.DataFrame(data=timeData, index = np.array([1]))

Python 中的数据框:

datetimeOFFSET                         datetime                           datetimeString
2019-12-30 10:29:07.913715+00:00 2019-12-30 10:29:07.913715+00:00 2019-12-30 10:29:07+0000

sql server 中的结果:

enter image description here

我想要的是 datetimeOFFSET 列显示正确的偏移量 (+00:00),而不是系统偏移量 (+01:00)。

最佳答案

2021 年 4 月更新:

这仍然是 known issue与 pandas .to_sql()

<小时/>

原始答案(警告:包括 1.4 版中已弃用的过时 SQLAlchemy 1.3 使用模式)

最近(如“今天早上”)对 SQLAlchemy 中的 datetimeoffset 处理进行了一些改进。它们将包含在下一个版本(可能是 1.3.13)中,但同时尝试从 1.3.x 分支的最新源安装...

pip install --upgrade git+https://github.com/sqlalchemy/sqlalchemy@rel_1_3

...看看这是否更适合您。

编辑:

经过进一步调查,问题似乎出在 to_sql 上。如果 DataFrame 包含单行,则时区偏移量将丢失:

import datetime
from pprint import pprint

import sqlalchemy as sa

# ...

engine = sa.create_engine(connection_uri, fast_executemany=True)

# test environment
table_name = 'DateTimeOffset_Test'
engine.execute(sa.text(f"DROP TABLE IF EXISTS [{table_name}]"))
engine.execute(sa.text(f"CREATE TABLE [{table_name}] (id int primary key, dto datetimeoffset)"))

# test data
my_tz = datetime.timezone(datetime.timedelta(hours=-7))
dto_value = datetime.datetime(2020, 1, 1, 0, 0, 0, tzinfo=my_tz)
print(dto_value) # 2020-01-01 00:00:00-07:00
# ^

num_rows = 1
row_data = [(x, dto_value) for x in range(num_rows)]
df = pd.DataFrame(row_data, columns=['id', 'dto'])
print(df)
# id dto
# 0 0 2020-01-01 00:00:00-07:00
# ^
df.to_sql(table_name, engine, if_exists='append', index=False)
result = engine.execute(sa.text(f"SELECT id, CAST(dto as varchar(50)) AS foo FROM [{table_name}]")).fetchall()
pprint(result)
# [(0, '2020-01-01 00:00:00.0000000 +00:00')]
# ^ -- wrong

但是,如果 DataFrame 包含多于一行,则 datetimeoffset 值会正确上传:

# ...

num_rows = 2
row_data = [(x, dto_value) for x in range(num_rows)]
df = pd.DataFrame(row_data, columns=['id', 'dto'])
print(df)
# id dto
# 0 0 2020-01-01 00:00:00-07:00
# 1 1 2020-01-01 00:00:00-07:00
# ^
df.to_sql(table_name, engine, if_exists='append', index=False)
result = engine.execute(sa.text(f"SELECT id, CAST(dto as varchar(50)) AS foo FROM [{table_name}]")).fetchall()
pprint(result)
# [(0, '2020-01-01 00:00:00.0000000 -07:00'),
# (1, '2020-01-01 00:00:00.0000000 -07:00')]
# ^ -- correct

如果您真的对此有强烈的感受,您可能想提出 pandas issue关于它。

关于python - 使用 pyodbc 时,SQL Server DateTimeOffset 将 tz 感知日期时间的偏移量更改为系统偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59529424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com