Valmistautuminen ohjelmointihaastatteluihin · Oppitunti

Päivämääräaritmetiikka ja aikavälit

Ajanjaksojen lisääminen ja vähentäminen sekä päivämäärien välisten erojen laskeminen.

Oppitunti 1/413 vaihetta

Päivämääräaritmetiikka ja aikavälit on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Valmistautuminen ohjelmointihaastatteluihin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.

Miksi päivämääräaritmetiikkaa kysytään haastatteluissa

Päivämääräaritmetiikka on yksi käytännöllisimmistä SQL-taidoista, joten haastattelijat painottavat sitä erityisesti analyytikko- ja backend-tehtävissä. Lähes jokaiseen liiketoimintakysymykseen liittyy aikakomponentti: viimeiset 30 päivää, tilaukset viikossa tai rekisteröitymisestä kuluneet päivät.

Haasteena on, että päivämääräfunktiot ovat SQL:n vähiten standardoitu osa. Sama toiminto kirjoitetaan eri tavalla PostgreSQL:ssä, MySQL:ssä ja SQL Serverissä. Vahva hakija kertoo ensin idean selkeästi ja mukauttaa sitten syntaksin käytettävään murteeseen.

  • Ajanjakson lisääminen tai vähentäminen
  • Kahden päivämäärän välisen eron laskeminen
  • INTERVAL-arvojen käyttäminen

INTERVAL-tietotyyppi

PostgreSQL:ssä ja SQL-standardissa ajanjakso on ensimmäisen luokan arvo, jota kutsutaan intervaliksi. Se lisätään päivämäärään tai aikaleimaan tavallisilla +- ja --operaattoreilla.

Tämä on selkein tapa ilmaista ”30 päivää sitten” tai ”3 kuukauden kuluttua”, ja haastattelijat pitävät siitä, koska ilmaisu muistuttaa luonnollista kieltä.

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;

Ajanjaksojen lisääminen eri SQL-murteissa

Haastattelijat kysyvät usein: ”miten lisäisitte 7 päivää MySQL:ssä verrattuna SQL Serveriin?” Kolmen suuren murteen tunteminen osoittaa käytännön kokemusta.

  • PostgreSQL: d + INTERVAL '7 days'
  • MySQL: DATE_ADD(d, INTERVAL 7 DAY)
  • SQL Server: DATEADD(day, 7, d)

Idea on sama; vain syntaksi muuttuu. Nimetkää aina, mille murteelle kirjoitatte.

-- 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;

Kahden päivämäärän välinen ero

Päivämääräaritmetiikan toinen puoli on kahden päivämäärän välisen etäisyyden laskeminen. Tulos riippuu käytetystä yksiköstä ja murteesta.

PostgreSQL:ssä kahden date-arvon vähentäminen antaa suoraan päivien kokonaismäärän. Kahden timestamp-arvon vähentäminen antaa sen sijaan intervalin.

-- Postgres: date - date returns an integer (days)
SELECT shipped_date - order_date AS days_to_ship
FROM orders;

DATEDIFF ja sen sudenkuopat

DATEDIFF on käytettävissä MySQL:ssä ja SQL Serverissä, mutta toimii niissä eri tavalla. Tämä on haastatteluissa suosittu kompakysymys.

  • MySQL: DATEDIFF(end, start) palauttaa vain kokonaiset päivät.
  • SQL Server: DATEDIFF(unit, start, end) ottaa yksikön ja laskee rajojen ylitykset, ei kokonaisia kuluneita yksiköitä.

Tällä rajojen ylityksiin perustuvalla toiminnalla on merkitystä: SQL Serverissä DATEDIFF(year, '2023-12-31', '2024-01-01') palauttaa arvon 1, vaikka aikaa kului vain yksi päivä.

-- 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'); -- 1

Iän laskeminen vuosina oikein

”Laske asiakkaan ikä vuosina” on klassinen tehtävä. Päiväeron naiivissa jakamisessa 365:llä on vaihtelua karkausvuosien vuoksi. PostgreSQL:ssä on AGE(), joka palauttaa todellisen kalenterin mukaisen intervalin.

Saadaksenne siistin vuosien kokonaismäärän irrottakaa iästä vuosiosa.

-- 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;

Esimerkki: tilaukset viimeisiltä 30 päivältä

Tämä on lähes yleispätevä haastattelusuodatus. Oikea tapa on verrata päivämääräsaraketta laskettuun rajapäivään, ei käyttää sarakkeen ympärillä funktiota.

Kun order_date-saraketta verrataan vakioon laskettuun rajapäivään, sarakkeessa oleva indeksi order_date säilyy käytettävissä. Palaamme tähän indeksiä koskevaan seikkaan myöhemmin.

SELECT COUNT(*) AS recent_orders
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days';

Puoliavoimet välit kalenterikuukaudelle

Kun teiltä kysytään ”kaikki tilaukset maaliskuulta 2024”, välttäkää lauseketta BETWEEN '2024-03-01' AND '2024-03-31' aikaleimasarakkeessa. Se jättää 31. maaliskuuta kello 23 olevat rivit huomiotta ja on altis yhden arvon rajan virheille.

Luotettava toimintamalli on puoliavoin väli: käyttäkää aloitusarvolle ehtoa >= ja seuraavan kuukauden alulle ehtoa <. Tämä toimii sarakkeen tarkkuudesta riippumatta.

SELECT *
FROM orders
WHERE order_ts >= DATE '2024-03-01'
  AND order_ts <  DATE '2024-04-01';

EXTRACT ja päivämäärän osat

Yhden päivämäärän osan poimiminen on raportoinnissa jatkuvasti tarvittava toimenpide. Standardifunktio on EXTRACT(part FROM d), jota PostgreSQL ja MySQL tukevat.

  • EXTRACT(YEAR FROM d), MONTH, DAY
  • EXTRACT(DOW FROM d) viikonpäivää varten
  • SQL Serverissä käytetään sen sijaan funktiota DATEPART(weekday, d)

Huomioikaa, että pelkän MONTH-osan poimiminen ryhmittelee eri vuosien maaliskuut yhteen, mikä on harvoin haluttu lopputulos.

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;

Syvällisempi esimerkki: seuraavaan syntymäpäivään jäljellä olevat päivät

Tämä on vaativampi aritmeettinen pulma, jossa yhdistyvät osan poimiminen ja lisääminen. Muodostakaa kuluvan vuoden syntymäpäivä syntymäkuukauden ja -päivän perusteella ja siirtäkää se seuraavaan vuoteen, jos päivä on jo ollut.

Kun selostatte tämän ääneen, osoitatte haastattelijalle pystyvänne käsittelemään reunatapauksia, kuten tilannetta, jossa syntymäpäivä on jo ollut kuluvana vuonna.

-- 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;

Kuukauden ensimmäinen ja viimeinen päivä

”Anna kunkin tilauksen kuukauden viimeinen päivä” testaa, käytättekö valmista toimintoa vai toteutatteko sen itse. PostgreSQL:ssä DATE_TRUNC yhdistetään interval-aritmetiikkaan; MySQL:ssä on suoraan käytettävissä LAST_DAY().

Postgresin viimeisen päivän laskemisen idea on tämä: katkaiskaa päivämäärä kuukauden alkuun, lisätkää yksi kuukausi ja vähentäkää yksi päivä.

-- 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)

Pikatarkistus

Testatkaa, ymmärrättekö eri SQL-murteiden päivämääräerojen laskennan toimintatavat.

Kertaus: päivämääräaritmetiikka ja intervalit

Haastattelun tärkeimmät opit:

  • Käyttäkää Postgresissa INTERVAL-arvoja yhdessä +/--operaattoreiden kanssa; MySQL:ssä DATE_ADD/DATEDIFF-funktioita; SQL Serverissä DATEADD/DATEDIFF-funktioita.
  • SQL Serverin DATEDIFF laskee rajojen ylityksiä, ei kuluneita yksiköitä. Tämä on yleisin kompa.
  • Vuosina ilmaistavaa ikää laskettaessa poimikaa tieto AGE()-funktion tuloksesta sen sijaan, että jakaisitte päivät 365:llä.
  • Suodattakaa viimeaikaiset rivit vertaamalla saraketta laskettuun rajapäivään ja käyttäkää kuukausiväleissä puoliavoimia välejä (>= start AND < next).

Kertokaa ensin käsite ja mukauttakaa syntaksi sitten käytettävään SQL-murteeseen.

Aloita maksutta

Opi Valmistautuminen ohjelmointihaastatteluihin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
90
Oppitunnit
360

Usein kysytyt kysymykset

Onko oppitunti ”Päivämääräaritmetiikka ja aikavälit” ilmainen?

Kyllä – oppitunnin ”Päivämääräaritmetiikka ja aikavälit” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Valmistautuminen ohjelmointihaastatteluihin-kurssin, päivitä CoddyKit PROhon. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Päivämääräaritmetiikka ja aikavälit”?

Ajanjaksojen lisääminen ja vähentäminen sekä päivämäärien välisten erojen laskeminen. Harjoittelet Valmistautuminen ohjelmointihaastatteluihin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Valmistautuminen ohjelmointihaastatteluihin-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Valmistautuminen ohjelmointihaastatteluihin-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Päivämääräaritmetiikka ja aikavälit”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Valmistautuminen ohjelmointihaastatteluihin-oppitunnilla?

Kyllä. Jokainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Päivämääräaritmetiikka ja aikavälit
  2. Päivämäärien katkaisu ja ryhmittely
  3. Merkkijonojen jäsentäminen ja muotoilu
  4. Aikavyöhykkeet ja aikaleimat
← Takaisin: Valmistautuminen ohjelmointihaastatteluihin