Last chance! 50% off DataCamp Premium
Sale ends in
De Snowflake-functie DATEADD is een relatief eenvoudige maar krachtige manier om datumrekenkunde uit te voeren. Hiermee kunnen dataprofessionals een specifieke tijdsinterval optellen bij of aftrekken van een date-, time- of timestampwaarde.
Begrijpen hoe je DATEADD gebruikt, stelt data-analisten en -engineers in staat om nuttige analyses te doen, zoals het berekenen van abonnementsperioden, prognoses maken voor toekomstige data en zelfs tijdreeksdatasets genereren voor verdere analyse.
In deze tutorial leer je de syntaxis van de functie, hoe je die in de praktijk toepast en de algemene mogelijkheden van de DATEADD-functie binnen je toolkit voor datummanipulatie in Snowflake SQL.
Ben je net begonnen met Snowflake? Bekijk dan zeker onze Snowflake Foundations skill track.
Voordat we in de details van DATEADD duiken, maken we een voorbeelddatabase met datumrijke data zodat onze voorbeelden praktischer en hands-on zijn. Werken met echte data helpt de concepten te verankeren terwijl we de mogelijkheden van de functie leren kennen.
Als je nieuw bent bij Snowflake, moet je een gratis proefaccount aanmaken dat 30 dagen tegoed biedt. Voor een uitgebreide introductie tot het platform, bekijk deze cursus Introduction to Snowflake, die de basis en fundamenten behandelt.
In Snowflake worden SQL-queries uitgevoerd in “Worksheets” (vergelijkbaar met notebooks). Zo maak je een nieuw worksheet:
Als je helemaal nieuw bent met de Snowflake-interface, biedt deze Snowflake Tutorial For Beginners een handige rondleiding door het platform.
Voor deze tutorial gebruiken we de Snowflake Learning-database en het public-schema:
-- Create database and schema
USE DATABASE SNOWFLAKE_LEARNING_DB;
USE SCHEMA PUBLIC;
We maken drie tabellen met datumgerelateerde data om ‘DATEADD’ in verschillende scenario’s te demonstreren:
Let op: Gebruik “Command + Shift + Enter”/”Ctrl + Shift + Enter” om de volgende commando’s in je worksheet in één keer uit te voeren:
-- Create subscription table
CREATE OR REPLACE TABLE subscriptions (
subscription_id INTEGER,
customer_id INTEGER,
plan_name VARCHAR(50),
start_date DATE,
end_date DATE,
billing_cycle VARCHAR(20)
);
-- Create orders table with timestamps
CREATE OR REPLACE TABLE orders (
order_id INTEGER,
customer_id INTEGER,
order_timestamp TIMESTAMP_NTZ,
delivery_estimate TIMESTAMP_NTZ,
total_amount DECIMAL(10,2)
);
-- Create events table with time zones
CREATE OR REPLACE TABLE events (
event_id INTEGER,
event_name VARCHAR(100),
event_timestamp TIMESTAMP_TZ,
duration_minutes INTEGER
);
Voor meer details over het maken van tabellen, inclusief verschillende tafeltypes en best practices, zie Creating Tables in Snowflake.
Tip: Verwijder alle bestaande queries uit je worksheet nadat ze succesvol zijn uitgevoerd.
We voegen voorbeelddata in met een reeks datum- en tijdwaarden:
-- Insert subscription data
INSERT INTO subscriptions VALUES
(1001, 5001, 'Basic', '2023-01-15', '2023-07-15', 'Monthly'),
(1002, 5002, 'Premium', '2023-02-28', '2024-02-28', 'Annual'),
(1003, 5003, 'Premium', '2023-01-31', '2023-04-30', 'Quarterly'),
(1004, 5001, 'Pro', '2022-12-15', '2023-12-15', 'Annual'),
(1005, 5004, 'Basic', '2023-03-15', NULL, 'Monthly');
-- Insert orders with timestamps
INSERT INTO orders VALUES
(10001, 5001, '2023-03-10 08:30:00', '2023-03-12 14:00:00', 125.99),
(10002, 5002, '2023-03-10 12:15:30', '2023-03-11 09:00:00', 89.50),
(10003, 5003, '2023-03-09 17:45:20', '2023-03-15 13:30:00', 245.00),
(10004, 5001, '2023-02-28 23:59:59', '2023-03-05 10:00:00', 49.99),
(10005, 5004, '2023-03-01 00:00:01', '2023-03-02 12:00:00', 175.25);
-- Insert events
INSERT INTO events VALUES
(101, 'System Update', '2023-03-15 01:00:00'::TIMESTAMP_TZ, 120),
(102, 'Maintenance', '2023-03-20 22:00:00'::TIMESTAMP_TZ, 60),
(103, 'Data Migration', '2023-03-18 15:30:00'::TIMESTAMP_TZ, 180),
(104, 'Backup', '2023-03-10 03:00:00'::TIMESTAMP_TZ, 45),
(105, 'Security Audit', '2023-03-12 09:15:00'::TIMESTAMP_TZ, 90);
Laten we een paar basisqueries draaien om te controleren of onze data correct is geladen:
-- Check subscription data
SELECT * FROM subscriptions;
-- Check orders data
SELECT * FROM orders;
-- Check events data
SELECT * FROM events;
We hebben nu een functionele voorbeelddatabase met drie tabellen die verschillende date- en timestampformaten bevatten. Deze dataset vormt onze basis om de DATEADD-functie verderop in deze tutorial te verkennen.
De functie DATEADD is essentieel voor datumrekenkunde in Snowflake. Je kunt er specifieke tijdsintervallen mee optellen bij of aftrekken van date-, time- of timestampwaarden. Laten we bekijken hoe de functie werkt, te beginnen met de syntaxis en parameters.
De basissynthaxis voor de functie DATEADD is:
DATEADD(date_part, value, date_or_timestamp_expression)
Laten we elke parameter bekijken:
-- Basic DATEADD example
SELECT
DATEADD(MONTH, 3, '2023-01-15') AS three_months_later;
Uitleg: Deze query telt 3 maanden op bij 15 januari 2023. De parameters werken als volgt:
date_part (MONTH): Geeft de tijdseenheid aan die we optellen of aftrekkenvalue (3): Het aantal eenheden om op te tellen (positief) of af te trekken (negatief)date_or_timestamp_expression ('2023-01-15'): De startdatum die je aanpastOutput:
THREE_MONTHS_LATER
-----------------
2023-04-15
Snowflake ondersteunt verschillende date parts die je met DATEADD kunt gebruiken:
-- Examples of different date parts
SELECT
DATEADD(YEAR, 1, '2023-02-28') AS add_one_year,
DATEADD(QUARTER, 2, '2023-01-31') AS add_two_quarters,
DATEADD(MONTH, 3, '2023-01-31') AS add_three_months,
DATEADD(WEEK, 2, '2023-03-15') AS add_two_weeks,
DATEADD(DAY, 10, '2023-03-21') AS add_ten_days,
DATEADD(HOUR, 12, '2023-03-10 08:30:00') AS add_twelve_hours,
DATEADD(MINUTE, 45, '2023-03-10 08:30:00') AS add_forty_five_minutes,
DATEADD(SECOND, 30, '2023-03-10 08:30:00') AS add_thirty_seconds;
Aanvullende ondersteunde date parts zijn onder andere MILLISECOND, MICROSECOND, NANOSECOND en CENTURY.
Let op dat Snowflake in schrikkeljaren en bij datumeinden van maanden passende aanpassingen doet. Zo resulteert één jaar optellen bij 28 februari 2023 in 29 februari 2024 (schrikkeljaar).
De functie DATEADD kan ook tijdsintervallen aftrekken door negatieve waarden te gebruiken:
-- Subtracting time intervals with negative values
SELECT
DATEADD(MONTH, -3, '2023-03-15') AS three_months_ago,
DATEADD(DAY, -7, CURRENT_DATE()) AS one_week_ago,
DATEADD(HOUR, -48, CURRENT_TIMESTAMP()) AS two_days_ago_time;
Uitleg:
Output:
THREE_MONTHS_AGO ONE_WEEK_AGO TWO_DAYS_AGO_TIME
---------------- ------------ -----------------
2025-02-10 2025-05-03 2025-05-08 07:22:30.183 -0700
Het returntype van DATEADD hangt af van het type van de invoerexpressie:
DATE geeft het een DATE terugTIMESTAMP geeft het een TIMESTAMP terugTIME geeft het een TIME terugDATEADD behoudt het oorspronkelijke datatype van je invoer. Dit gedrag is belangrijk om te begrijpen, omdat het bepaalt hoe je het resultaat in volgende bewerkingen kunt gebruiken.
Als je bijvoorbeeld uren optelt bij een DATE-waarde, blijft het resultaat een DATE (de tijdcomponent wordt afgekapt), terwijl uren optellen bij een TIMESTAMP zowel datum- als tijdcomponent behoudt.
Inzicht in deze kernparameters en het gedrag van de DATEADD-functie vormt de basis voor de geavanceerdere use-cases die we in de volgende secties verkennen.
Nu we de syntaxis en het gedrag van DATEADD begrijpen, gaan we praktische toepassingen bekijken met onze voorbeelddata. In deze sectie laten we zien hoe DATEADD echte zakelijke problemen oplost en je analysemogelijkheden vergroot.
Een veelvoorkomende zakelijke eis is bepalen wanneer abonnementen verlengen op basis van hun factureringscyclus:
-- Calculate subscription renewal dates
SELECT
subscription_id,
customer_id,
plan_name,
start_date,
billing_cycle,
CASE
WHEN billing_cycle = 'Monthly' THEN DATEADD(MONTH, 1, start_date)
WHEN billing_cycle = 'Quarterly' THEN DATEADD(MONTH, 3, start_date)
WHEN billing_cycle = 'Annual' THEN DATEADD(YEAR, 1, start_date)
END AS first_renewal_date
FROM subscriptions;
Uitleg: Deze query berekent de eerste verlengingsdatum voor elk abonnement op basis van de factureringscyclus. We gebruiken DATEADD met verschillende date parts (MONTH of YEAR) en waarden (1, 3 of 1) afhankelijk van de cyclus.
Output:

Let op hoe Snowflake de overgang van 28 februari naar 28 februari (schrikkeljaar) correct afhandelt.
Laten we DATEADD gebruiken om geschatte bezorgvensters voor bestellingen te berekenen:
-- Calculate delivery windows based on order timestamps
SELECT
order_id,
customer_id,
order_timestamp,
delivery_estimate,
DATEADD(HOUR, -12, delivery_estimate) AS delivery_window_start,
delivery_estimate AS delivery_window_end,
DATEDIFF('HOUR', order_timestamp, delivery_estimate) AS estimated_hours_to_delivery
FROM orders
ORDER BY order_id;
Uitleg: Deze query:
Output:

Voor tijdreeksanalyse is vaak een datumdimensietabel nodig. Laten we er een maken met DATEADD:
-- Generate a date dimension table for analysis
WITH date_dimension AS (
SELECT
DATEADD(DAY, seq4(), '2023-01-01') AS calendar_date
FROM TABLE(GENERATOR(ROWCOUNT => 365))
)
SELECT
calendar_date,
YEAR(calendar_date) AS year,
MONTH(calendar_date) AS month,
MONTHNAME(calendar_date) AS month_name,
DAY(calendar_date) AS day,
DAYOFWEEK(calendar_date) AS day_of_week,
DAYNAME(calendar_date) AS day_name,
CASE
WHEN DAYOFWEEK(calendar_date) IN (0, 6) THEN TRUE
ELSE FALSE
END AS is_weekend,
QUARTER(calendar_date) AS quarter
FROM date_dimension
WHERE calendar_date <= '2023-03-31'
ORDER BY calendar_date
LIMIT 10;
Uitleg: Deze query:
DATEADD met een sequencegenerator om een reeks data voor 2023 te makenOutput:

Datumdimensietabellen verbeteren de performance van analyses aanzienlijk doordat datumkenmerken vooraf worden berekend in plaats van telkens in queries. Ze standaardiseren datumslogica binnen een organisatie en zorgen voor consistente definities van kwartalen, weekenden en andere perioden.
Deze aanpak vermindert fouten en maakt complexe tijdsgebonden analyses toegankelijker voor businessgebruikers. Datumdimensies maken ook efficiënt filteren en groeperen mogelijk op verschillende tijdshiërarchieën zoals jaar, kwartaal, maand en dag.
De DATEADD-functie in combinatie met sequencegeneratie biedt een eenvoudige methode om deze dimensietabellen te vullen zonder handmatige invoer.
Deze techniek kan worden uitgebreid om meerjarige kalenders of gespecialiseerde tijdsdimensies te maken, zoals fiscale kalenders of werkdagberekeningen. Extra kolommen kunnen feestdagvlaggen, weeknummers of aangepaste businessperioden bevatten die cruciaal zijn voor nauwkeurige rapportage.
Zodra deze dimensietabel is gemaakt, kan die met feittabellen worden gejoint om krachtige time intelligence-mogelijkheden in dashboards en rapporten te ondersteunen.
Laten we DATEADD gebruiken om aankomende geplande onderhoudsevents te analyseren:
-- Find upcoming events and calculate preparation time
SELECT
event_id,
event_name,
event_timestamp,
duration_minutes,
DATEADD(DAY, -3, event_timestamp) AS preparation_start,
DATEADD(MINUTE, duration_minutes, event_timestamp) AS event_end,
DATEDIFF('MINUTE', CURRENT_TIMESTAMP(), event_timestamp) AS minutes_until_event
FROM events
WHERE event_timestamp > CURRENT_TIMESTAMP()
ORDER BY event_timestamp;
Uitleg: Deze query:
Omdat al onze voorbeelddata uit 2023 komt, zal deze query in 2025 meestal geen resultaten tonen, maar conceptueel laat het zien hoe je geplande events analyseert.
Voor abonnementsbedrijven is het essentieel om factureringsperioden precies te berekenen:
-- Generate next 6 billing periods for monthly subscriptions
WITH billing_periods AS (
SELECT
subscription_id,
customer_id,
plan_name,
start_date,
seq AS billing_period_number,
DATEADD(MONTH, seq, start_date) AS billing_period_start,
DATEADD(DAY, -1, DATEADD(MONTH, seq + 1, start_date)) AS billing_period_end
FROM subscriptions
CROSS JOIN (SELECT seq4() AS seq FROM TABLE(GENERATOR(ROWCOUNT => 6)))
WHERE billing_cycle = 'Monthly'
)
SELECT
subscription_id,
customer_id,
plan_name,
billing_period_number,
billing_period_start,
billing_period_end,
DATEDIFF('DAY', billing_period_start, billing_period_end) + 1 AS days_in_period
FROM billing_periods
ORDER BY subscription_id, billing_period_number;
Uitleg: Deze query:
seq4())DATEADD(MONTH, seq, start_date)DATEADD(DAY, -1, DATEADD(MONTH, seq + 1, start_date)) Dit zorgt voor correcte afhandeling van verschillende maandlengtes (28/29/30/31 dagen)DATEDIFF('DAY', billing_period_start, billing_period_end) + 1 De +1 is nodig omdat DATEDIFF het verschil tussen data geeft, exclusief de einddatumsubscription_id en periode voor een logische weergaveOutput:

Let op dat DATEADD verschillende maandlengtes correct afhandelt en zo nauwkeurige factureringsperioden waarborgt.
Deze voorbeelden laten zien hoe DATEADD kan worden toegepast om veelvoorkomende zakelijke problemen met datummanipulatie op te lossen. Door DATEADD te combineren met andere SQL-functies, maak je krachtige queries voor tijdgebaseerde analyses en dataverwerking in Snowflake.
Laten we nu bekijken hoe de DATEADD-functie zich verhoudt tot enkele andere Snowflake-functies.
Waar DATEADD een specifiek tijdsinterval bij een datum optelt of eraf haalt, berekent DATEDIFF het verschil tussen twee data in een opgegeven eenheid. DATEDIFF retourneert een geheel getal dat het aantal volledige eenheden tussen data voorstelt, wat ideaal is voor het berekenen van duur, zoals abonnementslengtes of dagen sinds een bestelling.
DATE_TRUNC daarentegen verwijdert precisie uit een date/time-waarde door kleinere date parts op hun standaardwaarden te zetten, waardoor effectief naar een opgegeven eenheid wordt afgerond naar beneden.
-- Comparing the three functions
SELECT
DATEADD(MONTH, 3, '2023-01-15'::DATE) AS added_three_months,
DATEDIFF(DAY, '2023-01-15'::DATE, '2023-04-15'::DATE) AS days_between,
DATE_TRUNC(MONTH, '2023-01-15'::DATE) AS truncated_to_month;
Output:

Gebruik DATEADD wanneer je data vooruit of achteruit moet verschuiven met specifieke tijdsintervallen, zoals het berekenen van toekomstige verlengingsdata, bezorgvensters of betaalschema’s.
Kies DATEDIFF wanneer je verstreken tijd tussen twee data wilt meten, zoals leeftijd, duur of tijdsgebonden metrics voor rapportage.
DATE_TRUNC is het meest geschikt wanneer je data wilt groeperen per periode (dagelijks, maandelijks, per kwartaal), timestamps wilt standaardiseren op een consistente nauwkeurigheid of tijdshiërarchieën wilt maken voor analyse.
-- Function usage by scenario
SELECT
-- Scenario: Calculate next month's billing date
DATEADD(MONTH, 1, start_date) AS next_billing_date,
-- Scenario: Find how many days the subscription has been active
DATEDIFF(DAY, start_date, CURRENT_DATE()) AS subscription_age_days,
-- Scenario: Group by month for analysis
DATE_TRUNC(MONTH, start_date) AS billing_month
FROM subscriptions
LIMIT 3;

Loop je tegen problemen aan bij het gebruiken van de functie? Hier zijn enkele tips die je uit de brand kunnen helpen.
Snowflake gaat slim om met datumeinden van maanden bij gebruik van DATEADD. Bij het optellen van maanden bij een datum aan het einde van de maand geeft Snowflake de laatste dag van de resulterende maand terug, ongeacht het aantal dagen. Dit gedrag bewaart het “einde-van-de-maand”-concept, zelfs wanneer maanden verschillende lengtes hebben.
-- Month-end handling examples
SELECT
DATEADD(MONTH, 1, '2023-01-31') AS jan_to_feb, -- January 31 + 1 month = February 28
DATEADD(MONTH, 1, '2023-02-28') AS feb_to_mar, -- February 28 + 1 month = March 31
DATEADD(MONTH, 1, '2024-01-31') AS jan_to_feb_leap, -- January 31 + 1 month in leap year = February 29
DATEADD(YEAR, 1, '2023-02-28') AS normal_to_leap; -- February 28, 2023 + 1 year = February 29, 2024
Bij het werken met timestamps die tijdzones bevatten (TIMESTAMP_TZ), DATEADD houdt automatisch rekening met overgangen van en naar zomertijd. Dit zorgt voor nauwkeurige berekeningen over tijdswisselingen heen, maar kan soms onverwachte resultaten opleveren wanneer je specifieke intervallen rond DST-grenzen optelt.
-- Time zone handling with DST transition
SELECT
event_timestamp,
DATEADD(HOUR, 24, event_timestamp) AS add_24h,
DATEADD(DAY, 1, event_timestamp) AS add_1d
FROM (
SELECT CONVERT_TIMEZONE('America/Los_Angeles', '2023-03-12 01:30:00')::TIMESTAMP_TZ AS event_timestamp
); -- During spring forward DST transition
Rond timestamps bij DST-overgangen geldt: 24 uur optellen is niet altijd gelijk aan 1 dag optellen. De “add_1d"-aanpak levert in businesstoepassingen doorgaans intuitievere resultaten op.
DATEADD-fouten komen meestal door typemismatches of ongeldige input. Hier zijn veelvoorkomende issues en oplossingen:
-- Common error: Invalid date part
-- Error: "Invalid date part 'DATE'"
SELECT DATEADD(DATE, 1, '2023-01-15'); -- Incorrect: 'DATE' is not a valid date part
SELECT DATEADD(DAY, 1, '2023-01-15'); -- Correct: use 'DAY' instead
-- Common error: Type mismatch
-- Error: "Numeric value 'abc' is not recognized"
SELECT DATEADD(DAY, 'abc', '2023-01-15'); -- Incorrect: second parameter must be numeric
SELECT DATEADD(DAY, 10, '2023-01-15'); -- Correct: use numeric value
-- Common error: Invalid date format
-- Error: "Date 'January 15, 2023' is not recognized"
SELECT DATEADD(DAY, 1, 'January 15, 2023'); -- Incorrect: unrecognized date format
SELECT DATEADD(DAY, 1, '2023-01-15'); -- Correct: use YYYY-MM-DD format
Voor de beste performance bij grootschalig gebruik van DATEADD:
DATEADD liever toe in de transformatiefase dan in de filterfase wanneer mogelijk.DATEADD voor bereikgebaseerde berekeningen om indexgebruik te verbeteren.-- Inefficient pattern (calculating same value repeatedly)
SELECT *
FROM large_table
WHERE DATEADD(MONTH, 1, event_date) < CURRENT_DATE();
-- More efficient approach (calculate once)
WITH calc_dates AS (
SELECT *, DATEADD(MONTH, 1, event_date) AS next_month_date
FROM large_table
)
SELECT *
FROM calc_dates
WHERE next_month_date < CURRENT_DATE();
Inzicht in deze randgevallen en optimalisatietechnieken helpt je robuustere logica voor datummanipulatie in Snowflake te schrijven, veelvoorkomende valkuilen te vermijden en de performance te maximaliseren.
De Snowflake-functie DATEADD is een essentieel hulpmiddel voor datummanipulatie waarmee dataprofessionals tijdrekenkunde kunnen toepassen over verschillende date parts. De functie gaat voorspelbaar om met datumeinden van maanden, schrikkeljaren, tijdzones en overgangen van en naar zomertijd. We hebben gezien hoe DATEADD kan worden toegepast op abonnementsbeheer, bezorgtracking, het maken van datumdimensies en factureringsberekeningen. In combinatie met DATEDIFF en DATE_TRUNC wordt het een kerncomponent voor tijdgebaseerde analytics in Snowflake.
Voor meer Snowflake-kennis, bekijk de Snowflake Foundations skill track of verken Creating Tables in Snowflake om je datamodelleringsskills op te bouwen. De gids Using Snowflake Time Travel vult je begrip van temporele operaties aan. Beginners starten het best met de Snowflake Tutorial for Beginners.
De Snowflake-functie DATEADD wordt gebruikt om datumrekenkunde uit te voeren door specifieke tijdsintervallen (zoals dagen, maanden of jaren) op te tellen bij of af te trekken van date-, time- of timestampwaarden. Het wordt vaak gebruikt voor het berekenen van toekomstige data, abonnementsverlengingen en tijdreeksanalyse.
DATEADD gaat slim om met datumeinden van maanden door het “einde van de maand”-concept te behouden. Als je maanden optelt bij een datum aan het einde van de maand, retourneert het de laatste dag van de resulterende maand. Voor schrikkeljaren past het data automatisch aan (bijv. één jaar optellen bij 28 februari 2023 resulteert in 29 februari 2024).
DATEADD ondersteunt diverse date parts, waaronder YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND, MILLISECOND, MICROSECOND, NANOSECOND en CENTURY. Met elk date part kun je die specifieke tijdseenheid optellen bij of aftrekken van een datumwaarde.
Ja, DATEADD werkt met alle Snowflake-timestamptypen: TIMESTAMP_NTZ (geen tijdzone), TIMESTAMP_TZ (met tijdzone) en TIMESTAMP_LTZ (lokale tijdzone). Het behoudt het timestamptype en handelt tijdzoneconversies automatisch af.
Waar DATEADD data wijzigt door tijdsintervallen op te tellen of af te trekken, berekent DATEDIFF het verschil tussen twee data in een opgegeven eenheid en DATE_TRUNC verwijdert precisie door naar een opgegeven eenheid af te ronden. Ze dienen verschillende, maar complementaire doelen bij datummanipulatie.
Ik ben een contentmaker op het gebied van data science met meer dan 2 jaar ervaring en een van de grootste achterbannen op Medium. Ik schrijf graag uitgebreide artikelen over AI en ML met een vleugje sarcastische stijl, want je moet toch íets doen om ze wat minder saai te maken. Ik heb meer dan 130 artikelen en een DataCamp-cursus gemaakt, en er is nog een nieuwe in de maak. Mijn content is door meer dan 5 miljoen paar ogen gezien, van wie 20k volgers werden op zowel Medium als LinkedIn.
Topcursussen op DataCamp
Leerpad
Cursus
Leerpad

blog
Adel Nehme
15 min