From b39bc68ab788d38eb2141e3b16f947e8159bdd5e Mon Sep 17 00:00:00 2001 From: Gord Thompson Date: Tue, 31 Dec 2019 12:42:09 -0500 Subject: [PATCH] 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) --- doc/build/changelog/unreleased_13/5045.rst | 7 +++++++ lib/sqlalchemy/dialects/mssql/pyodbc.py | 4 ++-- test/dialect/mssql/test_types.py | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 doc/build/changelog/unreleased_13/5045.rst 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( -- 2.47.2