Päivämääräaritmetiikka ja aikavälit
Ajanjaksojen lisääminen ja vähentäminen sekä päivämäärien välisten erojen laskeminen.
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'); -- 1Iä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,DAYEXTRACT(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.
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
- Päivämääräaritmetiikka ja aikavälit
- Päivämäärien katkaisu ja ryhmittely
- Merkkijonojen jäsentäminen ja muotoilu
- Aikavyöhykkeet ja aikaleimat