diff --git a/sqlglot/generators/postgres.py b/sqlglot/generators/postgres.py index ed3f527c56..87d5d3df69 100644 --- a/sqlglot/generators/postgres.py +++ b/sqlglot/generators/postgres.py @@ -77,6 +77,13 @@ def func(self: PostgresGenerator, expression: DATE_ADD_OR_SUB) -> str: return func +def _extract_sql(part: str) -> t.Callable[[PostgresGenerator, exp.Func], str]: + def func(self: PostgresGenerator, expression: exp.Func) -> str: + return self.sql(exp.Extract(this=exp.var(part), expression=expression.this)) + + return func + + def _date_diff_sql(self: PostgresGenerator, expression: exp.DateDiff | exp.TsOrDsDiff) -> str: unit = expression.text("unit").upper() factor = DATE_DIFF_FACTOR.get(unit) @@ -306,6 +313,9 @@ def lateral_sql(self, expression: exp.Lateral) -> str: exp.DateDiff: _date_diff_sql, exp.DateStrToDate: datestrtodate_sql, exp.DateSub: _date_add_sql("-"), + exp.Day: _extract_sql("DAY"), + exp.Month: _extract_sql("MONTH"), + exp.Year: _extract_sql("YEAR"), exp.Explode: rename_func("UNNEST"), exp.ExplodingGenerateSeries: rename_func("GENERATE_SERIES"), exp.GenerateSeries: generate_series_sql("GENERATE_SERIES"), diff --git a/tests/dialects/test_postgres.py b/tests/dialects/test_postgres.py index 4f4f354845..4fb90f52f5 100644 --- a/tests/dialects/test_postgres.py +++ b/tests/dialects/test_postgres.py @@ -1765,6 +1765,14 @@ def test_round(self): "ROUND(CAST(x AS DECIMAL(18, 3)), 4)", read={"duckdb": "ROUND(x::DECIMAL, 4)"} ) + def test_extract_date_parts(self): + self.validate_all( + "SELECT EXTRACT(DAY FROM x), EXTRACT(MONTH FROM x), EXTRACT(YEAR FROM x)", + read={ + "tsql": "SELECT DAY(x), MONTH(x), YEAR(x)", + }, + ) + def test_datatype(self): self.assertEqual(exp.DataType.build("XML", dialect="postgres").sql("postgres"), "XML") self.validate_identity("CREATE TABLE foo (data XML)")