Functions
DuckDB comes with hundreds of built-in functions.
Date Functions
sql
-- Current timestampSELECT NOW();
-- Extract partsSELECT YEAR(created) AS year, MONTH(created) AS month, DAY(created) AS dayFROM my_stripe.charges;
-- Truncate to periodSELECT DATE_TRUNC('month', created) AS monthFROM my_stripe.charges;
-- Date arithmeticSELECT created + INTERVAL '7 days' AS one_week_laterFROM my_stripe.charges;
-- Difference in daysSELECT DATE_PART('day', NOW() - created) AS days_agoFROM my_stripe.charges;-- Current timestampSELECT NOW();
-- Extract partsSELECT YEAR(created) AS year, MONTH(created) AS month, DAY(created) AS dayFROM my_stripe.charges;
-- Truncate to periodSELECT DATE_TRUNC('month', created) AS monthFROM my_stripe.charges;
-- Date arithmeticSELECT created + INTERVAL '7 days' AS one_week_laterFROM my_stripe.charges;
-- Difference in daysSELECT DATE_PART('day', NOW() - created) AS days_agoFROM my_stripe.charges;String Functions
sql
-- ConcatenationSELECT firstname || ' ' || lastname AS full_nameFROM crm.contacts;
-- Lower/upper caseSELECT LOWER(email), UPPER(name)FROM my_stripe.customers;
-- SubstringSELECT SUBSTRING(email FROM 1 FOR 5)FROM my_stripe.customers;
-- Split and extractSELECT SPLIT_PART(email, '@', 2) AS domainFROM my_stripe.customers;
-- ReplaceSELECT REPLACE(phone, '-', '')FROM crm.contacts;
-- LengthSELECT email, LENGTH(email) AS email_lengthFROM my_stripe.customers;-- ConcatenationSELECT firstname || ' ' || lastname AS full_nameFROM crm.contacts;
-- Lower/upper caseSELECT LOWER(email), UPPER(name)FROM my_stripe.customers;
-- SubstringSELECT SUBSTRING(email FROM 1 FOR 5)FROM my_stripe.customers;
-- Split and extractSELECT SPLIT_PART(email, '@', 2) AS domainFROM my_stripe.customers;
-- ReplaceSELECT REPLACE(phone, '-', '')FROM crm.contacts;
-- LengthSELECT email, LENGTH(email) AS email_lengthFROM my_stripe.customers;Numeric Functions
sql
-- RoundingSELECT ROUND(amount / 100.0, 2) AS dollarsFROM my_stripe.charges;
-- Floor/ceilingSELECT FLOOR(amount / 100.0), CEIL(amount / 100.0)FROM my_stripe.charges;
-- Absolute valueSELECT ABS(refund_amount)FROM my_stripe.charges;
-- FormattingSELECT FORMAT('{:,.2f}', amount / 100.0) AS formattedFROM my_stripe.charges;-- RoundingSELECT ROUND(amount / 100.0, 2) AS dollarsFROM my_stripe.charges;
-- Floor/ceilingSELECT FLOOR(amount / 100.0), CEIL(amount / 100.0)FROM my_stripe.charges;
-- Absolute valueSELECT ABS(refund_amount)FROM my_stripe.charges;
-- FormattingSELECT FORMAT('{:,.2f}', amount / 100.0) AS formattedFROM my_stripe.charges;Conditional Functions
sql
-- CASE expressionSELECT email, CASE WHEN amount >= 10000 THEN 'high' WHEN amount >= 1000 THEN 'medium' ELSE 'low' END AS tierFROM my_stripe.charges;
-- COALESCE (first non-null)SELECT COALESCE(name, email, 'Unknown') AS display_nameFROM my_stripe.customers;
-- NULLIFSELECT NULLIF(status, 'pending') AS active_statusFROM my_stripe.charges;
-- IIF (inline if)SELECT IIF(amount > 5000, 'Large', 'Small') AS sizeFROM my_stripe.charges;-- CASE expressionSELECT email, CASE WHEN amount >= 10000 THEN 'high' WHEN amount >= 1000 THEN 'medium' ELSE 'low' END AS tierFROM my_stripe.charges;
-- COALESCE (first non-null)SELECT COALESCE(name, email, 'Unknown') AS display_nameFROM my_stripe.customers;
-- NULLIFSELECT NULLIF(status, 'pending') AS active_statusFROM my_stripe.charges;
-- IIF (inline if)SELECT IIF(amount > 5000, 'Large', 'Small') AS sizeFROM my_stripe.charges;Window Functions
sql
-- Running totalSELECT created, amount, SUM(amount) OVER (ORDER BY created) AS running_totalFROM my_stripe.chargesWHERE status = 'succeeded';
-- RankSELECT email, SUM(amount) AS total, RANK() OVER (ORDER BY SUM(amount) DESC) AS rankFROM my_stripe.chargesJOIN my_stripe.customers ON charges.customer = customers.idGROUP BY email;
-- Lag/Lead (previous/next row)SELECT created, amount, LAG(amount) OVER (ORDER BY created) AS prev_amount, amount - LAG(amount) OVER (ORDER BY created) AS changeFROM my_stripe.charges;-- Running totalSELECT created, amount, SUM(amount) OVER (ORDER BY created) AS running_totalFROM my_stripe.chargesWHERE status = 'succeeded';
-- RankSELECT email, SUM(amount) AS total, RANK() OVER (ORDER BY SUM(amount) DESC) AS rankFROM my_stripe.chargesJOIN my_stripe.customers ON charges.customer = customers.idGROUP BY email;
-- Lag/Lead (previous/next row)SELECT created, amount, LAG(amount) OVER (ORDER BY created) AS prev_amount, amount - LAG(amount) OVER (ORDER BY created) AS changeFROM my_stripe.charges;JSON Functions
sql
-- Extract from JSONSELECT metadata->>'order_id' AS order_id, metadata->>'source' AS sourceFROM my_stripe.chargesWHERE metadata IS NOT NULL;
-- JSON array accessSELECT metadata->'items'->>0 AS first_itemFROM orders;-- Extract from JSONSELECT metadata->>'order_id' AS order_id, metadata->>'source' AS sourceFROM my_stripe.chargesWHERE metadata IS NOT NULL;
-- JSON array accessSELECT metadata->'items'->>0 AS first_itemFROM orders;