From: Gord Thompson Date: Tue, 31 Dec 2019 17:42:09 +0000 (-0500) Subject: Fix DATETIMEOFFSET formatting to preserve fractional seconds. X-Git-Tag: rel_1_3_13~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b39bc68ab788d38eb2141e3b16f947e8159bdd5e;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Fix DATETIMEOFFSET formatting to preserve fractional seconds. Fixed issue where a timezone-aware ``datetime`` value being converted to string for use as a parameter value of a :class:`.mssql.DATETIMEOFFSET` column was omitting the fractional seconds. Fixes: #5045 Closes: #5046 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/5046 Pull-request-sha: 99dc7b23f69b7b068795a02d20b88bf352c7dcd7 Change-Id: I971629466fe0675536bbdf55693f0c1821dfb3cc (cherry picked from commit 0d316e42f0645283c222f050c403c9c8d20463ec) --- diff --git a/doc/build/changelog/unreleased_13/5045.rst b/doc/build/changelog/unreleased_13/5045.rst new file mode 100644 index 0000000000..020e723a06 --- /dev/null +++ b/doc/build/changelog/unreleased_13/5045.rst @@ -0,0 +1,7 @@ +.. change:: + :tags: bug, mssql + :tickets: 5045 + + Fixed issue where a timezone-aware ``datetime`` value being converted to + string for use as a parameter value of a :class:`.mssql.DATETIMEOFFSET` + column was omitting the fractional seconds. diff --git a/lib/sqlalchemy/dialects/mssql/pyodbc.py b/lib/sqlalchemy/dialects/mssql/pyodbc.py index 9ce6861c06..c3304a7055 100644 --- a/lib/sqlalchemy/dialects/mssql/pyodbc.py +++ b/lib/sqlalchemy/dialects/mssql/pyodbc.py @@ -235,9 +235,9 @@ class _ODBCDateTimeOffset(DATETIMEOFFSET): def bind_processor(self, dialect): def process(value): """Convert to string format required by T-SQL.""" - dto_string = value.strftime("%Y-%m-%d %H:%M:%S %z") + dto_string = value.strftime("%Y-%m-%d %H:%M:%S.%f %z") # offset needs a colon, e.g., -0700 -> -07:00 - return dto_string[:23] + ":" + dto_string[23:] + return dto_string[:30] + ":" + dto_string[30:] return process diff --git a/test/dialect/mssql/test_types.py b/test/dialect/mssql/test_types.py index f837d3add0..3cf9d9036d 100644 --- a/test/dialect/mssql/test_types.py +++ b/test/dialect/mssql/test_types.py @@ -735,7 +735,7 @@ class TypeRoundTripTest( 11, 2, 32, - 0, + 123456, util.timezone(datetime.timedelta(hours=1)), ) t.insert().execute(