Datoregning og intervaller
Tilføjelse og fratrækning af perioder samt beregning af forskelle mellem datoer.
Datoregning og intervaller er en gratis Forberedelse til SQL-interview-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til SQL-interview, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.
Hvorfor datoberegning dukker op til jobsamtaler
Datoberegning er en af de mest praktiske SQL-færdigheder, så interviewere lægger stor vægt på den til analytiker- og backendroller. Næsten alle forretningsspørgsmål har et tidselement: de seneste 30 dage, ordrer pr. uge, dage siden tilmelding.
Udfordringen er, at datafunktioner er den mindst standardiserede del af SQL. Den samme operation har forskellig syntaks i PostgreSQL, MySQL og SQL Server. En stærk kandidat forklarer idéen klart og tilpasser derefter syntaksen til dialekten.
- Tilføjelse eller fratrækning af en periode
- Beregning af forskellen mellem to datoer
- Arbejde med
INTERVAL-værdier
INTERVAL-typen
I PostgreSQL og SQL-standarden er en tidsperiode en førsteklasses værdi, der kaldes et interval. Du lægger den til en dato eller et tidsstempel med de almindelige operatorer + og -.
Det er den enkleste måde at udtrykke "for 30 dage siden" eller "om 3 måneder" på, og interviewere kan lide det, fordi det ligner almindeligt sprog.
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;Tilføjelse af perioder på tværs af dialekter
Interviewere spørger ofte: "Hvordan vil du lægge 7 dage til i MySQL sammenlignet med SQL Server?" Kendskab til de tre store dialekter viser reel erfaring.
- PostgreSQL:
d + INTERVAL '7 days' - MySQL:
DATE_ADD(d, INTERVAL 7 DAY) - SQL Server:
DATEADD(day, 7, d)
Begrebet er identisk; kun skrivemåden ændres. Angiv altid, hvilken dialekt du skriver til.
-- 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;Forskel mellem to datoer
Den anden del af datoberegning er at beregne, hvor langt der er mellem to datoer. Resultatet afhænger af enheden og dialekten.
I PostgreSQL giver subtraktion af to date-værdier direkte et heltal svarende til antal dage. Subtraktion af to timestamp-værdier giver derimod et interval.
-- Postgres: date - date returns an integer (days)
SELECT shipped_date - order_date AS days_to_ship
FROM orders;DATEDIFF og faldgruberne
DATEDIFF findes i MySQL og SQL Server, men opfører sig forskelligt, hvilket er en yndet faldgrube til jobsamtaler.
- MySQL:
DATEDIFF(end, start)returnerer kun hele dage. - SQL Server:
DATEDIFF(unit, start, end)tager en enhed og tæller grænseoverskridelser, ikke hele enheder.
Denne opførsel ved grænser er vigtig: DATEDIFF(year, '2023-12-31', '2024-01-01') i SQL Server returnerer 1, selvom der kun er gået én dag.
-- 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'); -- 1Beregning af alder i år på den rigtige måde
"Beregn en kundes alder i år" er en klassisk opgave. En naiv dagsforskel divideret med 365 driver over tid på grund af skudår. PostgreSQL har AGE(), som returnerer et ægte kalenderinterval.
For at få et helt antal år skal du udtrække årsdelen af alderen.
-- 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;Praktisk eksempel: Ordrer i de seneste 30 dage
Dette er et næsten universelt filter til jobsamtaler. Den rigtige metode er at sammenligne datokolonnen med en beregnet grænsedato, ikke at omslutte kolonnen med en funktion.
Når du sammenligner order_date med en konstant grænsedato, kan et eventuelt indeks på order_date stadig bruges. Vi vender tilbage til dette indeksaspekt senere.
SELECT COUNT(*) AS recent_orders
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days';Halvåbne intervaller for en kalendermåned
Når du bliver bedt om "alle ordrer i marts 2024", skal du undgå BETWEEN '2024-03-01' AND '2024-03-31' på en tidsstempelkolonne. Det udelader rækker kl. 23 på den 31. marts og er tilbøjeligt til fejl ved grænseværdier.
Det robuste mønster er et halvåbent interval: >= starten og < starten på den næste måned. Det fungerer uanset kolonnens præcision.
SELECT *
FROM orders
WHERE order_ts >= DATE '2024-03-01'
AND order_ts < DATE '2024-04-01';EXTRACT og datodele
At hente en enkelt komponent ud af en dato er en fast del af rapporteringsarbejde. Standardfunktionen er EXTRACT(part FROM d), som understøttes af PostgreSQL og MySQL.
EXTRACT(YEAR FROM d),MONTH,DAYEXTRACT(DOW FROM d)for ugedag- SQL Server bruger i stedet
DATEPART(weekday, d)
Bemærk: Hvis du kun udtrækker MONTH, grupperes marts fra forskellige år sammen, hvilket sjældent er det, du ønsker.
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;Dybdegående eksempel: Dage til næste fødselsdag
Dette er en sværere beregningsopgave, der kombinerer udtræk og addition. Konstruér dette års fødselsdag ud fra fødselsmåned og -dag, og skift til næste år, hvis den allerede er passeret.
Hvis du gennemgår dette højt, viser du intervieweren, at du kan tænke over kanttilfælde som en fødselsdag, der allerede har været 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ørste og sidste dag i måneden
"Giv mig den sidste dag i hver ordres måned" tester, om du bruger en indbygget funktion eller genopfinder den. PostgreSQL sammensætter DATE_TRUNC med intervalberegning, mens MySQL har LAST_DAY() direkte.
Tricket til at finde den sidste dag i Postgres er at afkorte til månedens begyndelse, lægge én måned til og trække én dag fra.
-- 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)Hurtigt tjek
Afprøv din forståelse af, hvordan datoforskelle opfører sig på tværs af SQL-dialekter.
Opsummering: Datoberegning og intervaller
De vigtigste pointer til jobsamtalen:
- Brug
INTERVAL-værdier med+/-i Postgres,DATE_ADD/DATEDIFFi MySQL ogDATEADD/DATEDIFFi SQL Server. - SQL Server DATEDIFF tæller grænseoverskridelser, ikke forløbne enheder; det er den vigtigste faldgrube.
- Ved beregning af alder i år skal du udtrække fra
AGE()i stedet for at dividere antal dage med 365. - Filtrér nyere rækker ved at sammenligne kolonnen med en beregnet grænsedato, og brug halvåbne intervaller (
>= start AND < next) til måneders tidsvinduer.
Forklar først begrebet, og tilpas derefter dialekten.
Lær SQL med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 30
- Lektioner
- 120
Ofte stillede spørgsmål
Er lektionen “Datoregning og intervaller” gratis?
Ja — hele teksten til “Datoregning og intervaller” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til SQL-interview-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Datoregning og intervaller”?
Tilføjelse og fratrækning af perioder samt beregning af forskelle mellem datoer. Du øver dig i Forberedelse til SQL-interview med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Forberedelse til SQL-interview?
Der kræves ingen tidligere erfaring. Forberedelse til SQL-interview på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Datoregning og intervaller”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Forberedelse til SQL-interview-lektion?
Ja. Alle Forberedelse til SQL-interview-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Datoregning og intervaller
- Afkortning og gruppering af datoer
- Parsing og formatering af strenge
- Tidszoner og tidsstempler