Datumaritmetik och intervall
Addera eller subtrahera tidsperioder och beräkna skillnader mellan datum.
Datumaritmetik och intervall är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Varför datumaritmetik dyker upp på intervjuer
Datumaritmetik är en av de mest praktiska SQL-färdigheterna, så intervjuare använder den ofta för analytiker- och backendroller. Nästan alla verksamhetsfrågor har en tidskomponent: de senaste 30 dagarna, beställningar per vecka, dagar sedan registreringen.
Problemet är att datumfunktioner är den minst standardiserade delen av SQL. Samma operation har olika syntax i PostgreSQL, MySQL och SQL Server. En stark kandidat anger först idén tydligt och anpassar sedan syntaxen till dialekten.
- Lägga till eller dra ifrån en tidsperiod
- Beräkna skillnaden mellan två datum
- Arbeta med
INTERVAL-värden
INTERVAL-typen
I PostgreSQL och SQL-standarden är en tidsperiod ett förstaklassvärde som kallas interval. Den läggs till ett datum eller en tidsstämpel med vanliga operatorer som + och -.
Detta är det tydligaste sättet att uttrycka "för 30 dagar sedan" eller "om 3 månader", och intervjuare uppskattar det eftersom det läses som vanlig engelska.
SELECT
CURRENT_DATE,
CURRENT_DATE + INTERVAL '7 days' AS next_week,
CURRENT_DATE - INTERVAL '1 month' AS last_month,
NOW() + INTERVAL '90 minutes' AS soon;Lägga till tidsperioder i olika dialekter
Intervjuare frågar ofta: "hur skulle Ni lägga till 7 dagar i MySQL jämfört med SQL Server?" Kunskap om de tre stora dialekterna signalerar verklig erfarenhet.
- PostgreSQL:
d + INTERVAL '7 days' - MySQL:
DATE_ADD(d, INTERVAL 7 DAY) - SQL Server:
DATEADD(day, 7, d)
Konceptet är identiskt; endast syntaxen ändras. Ange alltid vilken dialekt Ni skriver för.
-- MySQL
SELECT DATE_ADD(order_date, INTERVAL 7 DAY) AS due_date FROM orders;
-- SQL Server
SELECT DATEADD(day, 7, order_date) AS due_date FROM orders;Skillnaden mellan två datum
Den andra delen av datumaritmetik är att beräkna hur långt det är mellan två datum. Resultatet beror på enheten och dialekten.
I PostgreSQL ger subtraktion av två date-värden direkt ett heltal som anger antalet dagar. Subtraktion av två timestamp-värden ger däremot ett intervall.
-- Postgres: date - date returns an integer (days)
SELECT shipped_date - order_date AS days_to_ship
FROM orders;DATEDIFF och dess fallgropar
DATEDIFF finns i MySQL och SQL Server men fungerar olika, vilket är en vanlig intervjufälla.
- MySQL:
DATEDIFF(end, start)returnerar endast hela dagar. - SQL Server:
DATEDIFF(unit, start, end)tar en enhet och räknar gränsövergångar, inte hela enheter.
Detta beteende är viktigt: DATEDIFF(year, '2023-12-31', '2024-01-01') i SQL Server returnerar 1, trots att bara en dag har gått.
-- SQL Server: counts boundaries, not elapsed time
SELECT DATEDIFF(year, '2023-12-31', '2024-01-01'); -- 1
SELECT DATEDIFF(day, '2023-12-31', '2024-01-01'); -- 1Beräkna ålder i år på rätt sätt
Att beräkna en kunds ålder i år är en klassiker. En naiv beräkning där dagsskillnaden delas med 365 blir fel på grund av skottår. PostgreSQL har AGE(), som returnerar ett verkligt kalenderintervall.
För att få ett helt antal år extraherar Ni ålderns årskomponent.
-- Postgres
SELECT
birth_date,
AGE(CURRENT_DATE, birth_date) AS exact_age,
EXTRACT(YEAR FROM AGE(CURRENT_DATE, birth_date)) AS age_years
FROM customers;Praktiskt exempel: beställningar under de senaste 30 dagarna
Detta är ett nästan universellt intervjufilter. Det korrekta sättet är att jämföra datumkolumnen med ett beräknat brytdatum, inte att omsluta kolumnen i en funktion.
Om order_date jämförs med ett konstant brytdatum förblir eventuella index på order_date användbara. Vi återkommer till denna indexaspekt senare.
SELECT COUNT(*) AS recent_orders
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days';Halvöppna intervall för en kalendermånad
När Ni får frågan om "alla beställningar i mars 2024" bör Ni undvika BETWEEN '2024-03-01' AND '2024-03-31' på en tidsstämpelkolumn. Det missar rader klockan 23 den 31 mars och är känsligt för fel vid gränsvärdet.
Det robusta mönstret är ett halvöppet intervall: >= början och < början på nästa månad. Det fungerar oavsett kolumnens precision.
SELECT *
FROM orders
WHERE order_ts >= DATE '2024-03-01'
AND order_ts < DATE '2024-04-01';EXTRACT och datumdelar
Att hämta ut en enskild komponent ur ett datum är vanligt i rapporteringsarbete. Standardfunktionen är EXTRACT(part FROM d), som stöds av PostgreSQL och MySQL.
EXTRACT(YEAR FROM d),MONTH,DAYEXTRACT(DOW FROM d)för veckodag- SQL Server använder i stället
DATEPART(weekday, d)
Observera: om endast MONTH extraheras grupperas marsmånader från olika år tillsammans, vilket sällan är vad som avses.
SELECT
EXTRACT(YEAR FROM order_ts) AS yr,
EXTRACT(MONTH FROM order_ts) AS mo,
COUNT(*) AS n
FROM orders
GROUP BY 1, 2
ORDER BY 1, 2;Fördjupat exempel: dagar till nästa födelsedag
Detta är ett svårare aritmetikproblem som kombinerar extrahering och addition. Skapa årets födelsedatum utifrån födelsemånad och födelsedag, och flytta fram det till nästa år om dagen redan har passerat.
Att gå igenom detta högt visar intervjuaren att Ni kan resonera om specialfall, till exempel en födelsedag som redan har inträffat i år.
-- Postgres
SELECT
name,
CASE
WHEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
EXTRACT(MONTH FROM birth_date)::int,
EXTRACT(DAY FROM birth_date)::int) >= CURRENT_DATE
THEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
EXTRACT(MONTH FROM birth_date)::int,
EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
ELSE MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int + 1,
EXTRACT(MONTH FROM birth_date)::int,
EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
END AS days_until
FROM customers;Första och sista dagen i månaden
"Ange den sista dagen i varje beställnings månad" testar om Ni använder en inbyggd funktion eller uppfinner lösningen på nytt. PostgreSQL kombinerar DATE_TRUNC med intervallaritmetik; MySQL har LAST_DAY() direkt.
Tricket för den sista dagen i Postgres är att trunkera till månadens början, lägga till en månad och dra ifrån en dag.
-- Postgres
SELECT
DATE_TRUNC('month', order_ts) AS month_start,
DATE_TRUNC('month', order_ts) + INTERVAL '1 month - 1 day' AS month_end
FROM orders;
-- MySQL: LAST_DAY(order_ts)Snabbkontroll
Testa Er förståelse av hur datumskillnader fungerar i olika dialekter.
Sammanfattning: datumaritmetik och intervall
Viktigaste lärdomarna inför intervjun:
- Använd
INTERVAL-värden med+/-i Postgres;DATE_ADD/DATEDIFFi MySQL;DATEADD/DATEDIFFi SQL Server. - SQL Server DATEDIFF räknar gränsövergångar, inte förflutna enheter – den vanligaste fallgropen.
- För ålder i år extraherar Ni värdet från
AGE()i stället för att dela antalet dagar med 365. - Filtrera nya rader genom att jämföra kolumnen med ett beräknat brytdatum och använd halvöppna intervall (
>= start AND < next) för månadsspann.
Ange konceptet först och anpassa sedan dialekten.
Lär dig SQL med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”Datumaritmetik och intervall” gratis?
Ja – hela texten till ”Datumaritmetik och intervall” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Vad lär jag mig i ”Datumaritmetik och intervall”?
Addera eller subtrahera tidsperioder och beräkna skillnader mellan datum. Ni övar på Förberedelser inför SQL-intervjun med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelser inför SQL-intervjun?
Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Datumaritmetik och intervall”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelser inför SQL-intervjun-lektionen?
Ja. Varje Förberedelser inför SQL-intervjun-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Datumaritmetik och intervall
- Avkorta och gruppera datum
- Tolka och formatera strängar
- Tidszoner och tidsstämplar