Some dbt packages come equipped with useful macros for generating date dimension tables. However, these macros often face limitations when used with Azure Synapse or similar Microsoft data warehousing (DWH) solutions.
For instance, the dbt_utils
package includes the date_spine
macro, but it doesn’t work as expected within Azure Synapse. This macro relies on a nested Common Table Expression (CTE), which isn’t compatible with this environment.1
Similarly, the dbt_date
package provides the get_date_dimension
macro, which seems very practical. Unfortunately, this package lacks support for Azure Synapse.2
We can avoid these issues by writing our own macro. Below, you’ll find a dbt macro that helps us create date dimension tables when using Azure Synapse and the likes.
the dim_date_azure macro
Let’s begin by creating the file dim_date_azure.sql
in the macros/
folder. The file will contain the following query, which allows us to generate a basic date spine between two dates:
dim_date_azure
macro generates a series of datesThe above macro uses the internal system tables of our DWH to generate a table with multiple rows, which is then transformed into dates.
the dim_date model
After saving the macro, we can use it to create a model in our models/
folder. Since we anticipate using these dates alongside other production tables, it makes sense to materialize the model as a table among our other production tables.
For example, let’s create a date dimension table spanning ten years, from 2015 to 2025:
dim_date
model builds a date dimension table using dim_date_azure
macroAfter materialization, the resulting table will have a d
column with a series of dates between the start_date
and end_date
.
using it dynamically
We can also use the above dim_date_azure
macro dynamically by using the run_query
macro in the same model. For example, we can set end_date
to be today’s date plus six months:
dim_date
model builds a date dimension table between a fixed start date and a dynamic end dateIn this way, every time we materialize dim_date
, the table will be updated with new dates accordingly. Happy querying.