From 7c6de172a2d17b70604dfd788631466667f964fb Mon Sep 17 00:00:00 2001 From: Han Hong <52536323+seunghanhong@users.noreply.github.com> Date: Sat, 17 Apr 2021 04:32:09 +1000 Subject: [PATCH] support quarter in postgres last day (#333) --- integration_tests/data/cross_db/data_last_day.csv | 1 + integration_tests/models/cross_db_utils/test_last_day.sql | 1 + macros/cross_db_utils/last_day.sql | 8 ++++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/integration_tests/data/cross_db/data_last_day.csv b/integration_tests/data/cross_db/data_last_day.csv index 186465d8..307fbeb6 100644 --- a/integration_tests/data/cross_db/data_last_day.csv +++ b/integration_tests/data/cross_db/data_last_day.csv @@ -1,4 +1,5 @@ date_day,date_part,result 2018-01-02,month,2018-01-31 +2018-01-02,quarter,2018-03-31 2018-01-02,year,2018-12-31 ,month, diff --git a/integration_tests/models/cross_db_utils/test_last_day.sql b/integration_tests/models/cross_db_utils/test_last_day.sql index 5391ae10..fee3a823 100644 --- a/integration_tests/models/cross_db_utils/test_last_day.sql +++ b/integration_tests/models/cross_db_utils/test_last_day.sql @@ -8,6 +8,7 @@ with data as ( select case when date_part = 'month' then {{ dbt_utils.last_day('date_day', 'month') }} + when date_part = 'quarter' then {{ dbt_utils.last_day('date_day', 'quarter') }} when date_part = 'year' then {{ dbt_utils.last_day('date_day', 'year') }} else null end as actual, diff --git a/macros/cross_db_utils/last_day.sql b/macros/cross_db_utils/last_day.sql index b66e9d30..160ec2e1 100644 --- a/macros/cross_db_utils/last_day.sql +++ b/macros/cross_db_utils/last_day.sql @@ -25,8 +25,12 @@ testing is required to validate that it will work on other dateparts. {% macro postgres__last_day(date, datepart) -%} {%- if datepart == 'quarter' -%} - {{ exceptions.raise_compiler_error( - "dbt_utils.last_day is not supported for datepart 'quarter' on this adapter") }} + -- postgres dateadd does not support quarter interval. + cast( + {{dbt_utils.dateadd('day', '-1', + dbt_utils.dateadd('month', '3', dbt_utils.date_trunc(datepart, date)) + )}} + as date) {%- else -%} {{dbt_utils.default_last_day(date, datepart)}} {%- endif -%}