diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index 4d017cfb15..c465c73ed1 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -19,6 +19,15 @@ :version: 1.0.12 :released: + .. change:: + :tags: bug, mssql + :tickets: 3624 + :pullreq: bitbucket:70 + + Fixed the syntax of the :func:`.extract` function when used on + MSSQL against a datetime value; the quotes around the keyword + are removed. Pull request courtesy Guillaume Doumenc. + .. change:: :tags: bug, orm :tickets: 3623 diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index f3d20b3aa8..8fdb8ee877 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -1181,7 +1181,7 @@ class MSSQLCompiler(compiler.SQLCompiler): def visit_extract(self, extract, **kw): field = self.extract_map.get(extract.field, extract.field) - return 'DATEPART("%s", %s)' % \ + return 'DATEPART(%s, %s)' % \ (field, self.process(extract.expr, **kw)) def visit_savepoint(self, savepoint_stmt): diff --git a/test/dialect/mssql/test_types.py b/test/dialect/mssql/test_types.py index a3dc6a91df..68a6908520 100644 --- a/test/dialect/mssql/test_types.py +++ b/test/dialect/mssql/test_types.py @@ -64,6 +64,18 @@ class MSDateTypeTest(fixtures.TestBase): result_processor, 'abc' ) + def test_extract(self): + from sqlalchemy import extract + fivedaysago = datetime.datetime.now() \ + - datetime.timedelta(days=5) + for field, exp in ('year', fivedaysago.year), \ + ('month', fivedaysago.month), ('day', fivedaysago.day): + r = testing.db.execute( + select([ + extract(field, fivedaysago)]) + ).scalar() + eq_(r, exp) + class TypeDDLTest(fixtures.TestBase):