summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/build/changelog/unreleased_13/5045.rst7
-rw-r--r--lib/sqlalchemy/dialects/mssql/pyodbc.py4
-rw-r--r--test/dialect/mssql/test_types.py2
3 files changed, 10 insertions, 3 deletions
diff --git a/doc/build/changelog/unreleased_13/5045.rst b/doc/build/changelog/unreleased_13/5045.rst
new file mode 100644
index 000000000..020e723a0
--- /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 9ce6861c0..c3304a705 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 f837d3add..3cf9d9036 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(