0Pricing
Coding Interview Prep · Ders

Tarih Aritmetiği ve Aralıklar

Dönemlerin eklenmesi veya çıkarılması ve tarihler arasındaki farkların hesaplanması.

Tarih Aritmetiği ve Aralıklar, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.

Tarih Hesaplamaları Mülakatlarda Neden Karşımıza Çıkar

Tarih aritmetiği en pratik SQL becerilerinden biridir; bu nedenle görüşmeciler analist ve arka uç rolleri için bu konuya sıkça başvurur. Neredeyse her iş sorusunun bir zaman boyutu vardır: son 30 gün, haftalık siparişler, kayıttan beri geçen günler.

Buradaki sorun, tarih işlevlerinin SQL'in standardizasyonu en düşük bölümünü oluşturmasıdır. Aynı işlem PostgreSQL, MySQL ve SQL Server'da farklı söz dizimlerine sahiptir. Başarılı bir aday önce fikri açıkça ifade eder, ardından söz dizimini kullanılan lehçeye uyarlar.

  • Bir zaman aralığını ekleme veya çıkarma
  • İki tarih arasındaki farkı hesaplama
  • INTERVAL değerleriyle çalışma

INTERVAL Türü

PostgreSQL'de ve SQL standardında bir zaman aralığı, zaman aralığı adı verilen birinci sınıf bir değerdir. Bir tarihi veya zaman damgasını doğrudan + ve - işleçleriyle buna ekleyebilir ya da bundan çıkarabilirsiniz.

Bu, "30 gün önce" veya "3 ay sonra" ifadelerini belirtmenin en temiz yoludur; ayrıca İngilizce gibi okunması nedeniyle görüşmeciler bunu çok beğenir.

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;

Lehçeler Arasında Zaman Aralıklarını Ekleme

Görüşmeciler sıkça şunu sorar: "MySQL'de 7 günü SQL Server'a kıyasla nasıl eklersiniz?" Üç büyük SQL lehçesini bilmek gerçek deneyime sahip olduğunuzu gösterir.

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

Kavram aynıdır; yalnızca yazım değişir. Yazdığınız lehçeyi her zaman belirtin.

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

İki Tarih Arasındaki Fark

Tarih aritmetiğinin diğer yarısı, iki tarihin birbirinden ne kadar uzak olduğunu hesaplamaktır. Sonuç, kullanılan birime ve lehçeye bağlıdır.

PostgreSQL'de iki date değerinin çıkarılması doğrudan tam sayı olarak gün sayısını verir. İki timestamp değerinin çıkarılması ise bir zaman aralığı verir.

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

DATEDIFF ve Tuzakları

DATEDIFF, MySQL'de ve SQL Server'da bulunur; ancak farklı davranır. Bu, mülakatlarda sık kullanılan yanıltıcı bir noktadır.

  • MySQL: DATEDIFF(end, start) yalnızca tam gün sayısını döndürür.
  • SQL Server: DATEDIFF(unit, start, end) bir birim alır ve tam birimleri değil, sınır geçişlerini sayar.

Bu sınır davranışı önemlidir: SQL Server'da DATEDIFF(year, '2023-12-31', '2024-01-01'), yalnızca bir gün geçmiş olsa bile 1 döndürür.

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

Yaşı Yıl Olarak Doğru Hesaplama

"Bir müşterinin yaşını yıl olarak hesaplayın" klasik bir sorudur. Gün farkını doğrudan 365'e bölmek, artık yıllar nedeniyle zamanla sapar. PostgreSQL'de gerçek bir takvim aralığı döndüren AGE() bulunur.

Tam sayı olarak temiz bir yıl sayısı elde etmek için yaşın yıl bölümünü çıkarın.

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

Uygulamalı Örnek: Son 30 Gündeki Siparişler

Mülakatlarda neredeyse evrensel bir filtre sorusudur. Doğru yöntem, tarih sütununa bir işlev uygulamak yerine bu sütunu hesaplanmış bir eşik tarihiyle karşılaştırmaktır.

order_date değerini sabit bir eşik tarihiyle karşılaştırmak, order_date üzerindeki herhangi bir dizinin kullanılabilir kalmasını sağlar. Bu dizin konusuna daha sonra döneceğiz.

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

Bir Takvim Ayı İçin Yarı Açık Aralıklar

"Mart 2024'teki tüm siparişleri verin" dendiğinde, zaman damgası sütununda BETWEEN '2024-03-01' AND '2024-03-31' kullanmaktan kaçının. Bu ifade 31 Mart saat 23.00'teki satırları dışarıda bırakır ve bir eksik ya da fazla sayım hatasına açıktır.

Sağlam yaklaşım yarı açık aralıktır: başlangıçtan >= ve sonraki ayın başlangıcından <. Bu yaklaşım, sütunun duyarlılığı ne olursa olsun çalışır.

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

EXTRACT ve Tarih Bölümleri

Bir tarihin tek bir bileşenini çekmek, raporlama çalışmalarında sürekli yapılan bir işlemdir. Standart işlev, PostgreSQL ve MySQL tarafından desteklenen EXTRACT(part FROM d) işlevidir.

  • EXTRACT(YEAR FROM d), MONTH, DAY
  • Haftanın günü için EXTRACT(DOW FROM d)
  • SQL Server bunun yerine DATEPART(weekday, d) kullanır

Not: yalnızca MONTH değerini çıkarmak, farklı yıllardaki Mart aylarını birlikte gruplar; genellikle istediğiniz sonuç bu değildir.

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;

Daha Derin Bir Örnek: Bir Sonraki Doğum Gününe Kalan Günler

Bu, bileşen çekme ve ekleme işlemlerini birleştiren daha zor bir hesaplama sorusudur. Doğum ayı ve gününden bu yılki doğum günü tarihini oluşturun; doğum günü geçtiyse tarihi sonraki yıla taşıyın.

Bu süreci yüksek sesle açıklamak, görüşmeciye bu yıl zaten gerçekleşmiş bir doğum günü gibi sınır durumları hakkında akıl yürütebildiğinizi gösterir.

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

Ayın İlk ve Son Günü

"Her siparişin bulunduğu ayın son gününü verin" sorusu, yerleşik bir işleve başvurup başvurmadığınızı veya bunu yeniden yazıp yazmadığınızı sınar. PostgreSQL, DATE_TRUNC işlevini aralık aritmetiğiyle birleştirir; MySQL'de doğrudan LAST_DAY() bulunur.

PostgreSQL'de ayın son gününü bulmanın püf noktası şudur: ayın başlangıcına kırpın, bir ay ekleyin ve bir gün çıkarın.

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

Hızlı Kontrol

Farklı SQL lehçelerindeki tarih farkı davranışını anladığınızı sınayın.

Özet: Tarih Aritmetiği ve Zaman Aralıkları

Mülakat için temel çıkarımlar:

  • PostgreSQL'de +/- ile INTERVAL değerlerini; MySQL'de DATE_ADD/DATEDIFF işlevlerini; SQL Server'da DATEADD/DATEDIFF işlevlerini kullanın.
  • SQL Server DATEDIFF sınır geçişlerini sayar; geçen zaman birimlerini saymaz. En önemli yanıltıcı nokta budur.
  • Yaşı yıl olarak hesaplamak için günleri 365'e bölmek yerine AGE() sonucundan yıl bölümünü çıkarın.
  • Yakın tarihli satırları sütunu hesaplanmış bir eşikle karşılaştırarak filtreleyin ve ay aralıkları için yarı açık aralıklar (>= start AND < next) kullanın.

Önce kavramı açıklayın, sonra lehçeye uyarlayın.

Sıkça Sorulan Sorular

“Tarih Aritmetiği ve Aralıklar” dersi ücretsiz mi?

Evet — “Tarih Aritmetiği ve Aralıklar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.

“Tarih Aritmetiği ve Aralıklar” dersinde ne öğreneceğim?

Dönemlerin eklenmesi veya çıkarılması ve tarihler arasındaki farkların hesaplanması. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Tarih Aritmetiği ve Aralıklar” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Tarih Aritmetiği ve Aralıklar
  2. Tarihleri Kırpma ve Gruplama
  3. Dizeleri Ayrıştırma ve Biçimlendirme
  4. Saat Dilimleri ve Zaman Damgaları
← Coding Interview Prep Sayfasına Dön