DO $$ BEGIN IF to_regclass('sales_orders_p') IS NULL THEN EXECUTE $q$ CREATE TABLE sales_orders_p ( LIKE sales_orders INCLUDING ALL ) PARTITION BY RANGE (order_date) $q$; END IF; IF to_regclass('purchase_orders_p') IS NULL THEN EXECUTE $q$ CREATE TABLE purchase_orders_p ( LIKE purchase_orders INCLUDING ALL ) PARTITION BY RANGE (order_date) $q$; END IF; END $$; DO $$ DECLARE d date := date_trunc('month', now())::date; next_d date := (date_trunc('month', now()) + interval '1 month')::date; part_name text; BEGIN part_name := format('sales_orders_p_%s', to_char(d, 'YYYYMM')); EXECUTE format( 'CREATE TABLE IF NOT EXISTS %I PARTITION OF sales_orders_p FOR VALUES FROM (%L) TO (%L)', part_name, d, next_d ); part_name := format('purchase_orders_p_%s', to_char(d, 'YYYYMM')); EXECUTE format( 'CREATE TABLE IF NOT EXISTS %I PARTITION OF purchase_orders_p FOR VALUES FROM (%L) TO (%L)', part_name, d, next_d ); END $$;