🧚 Dengar! Beekeeper Studio adalah GUI database yang cepat, modern, dan open source Unduh
13 Januari 2026 Oleh Matthew Rathbone

DATEDIFF mengembalikan jumlah hari, bulan, atau satuan lain di antara dua tanggal. Setiap database punya caranya sendiri, dan contoh-contoh di sini mencakup PostgreSQL, MySQL, SQLite, dan SQL Server.

Cara menggunakan DATEDIFF

DATEDIFF menghitung hari, bulan, tahun, atau satuan lain dari tanggal mulai hingga tanggal akhir. Ini versi SQL Server, yang paling sering dimaksud orang:

DATEDIFF(unit, start_date, end_date)
SELECT DATEDIFF(day, '2026-01-01', '2026-03-15');
-- Output: 73

SELECT DATEDIFF(month, '2026-01-01', '2026-03-15');
-- Output: 2

SELECT DATEDIFF(day, '2026-03-15', '2026-01-01');
-- Output: -73

Satuannya bisa year, quarter, month, week, day, hour, minute, second, atau yang lebih kecil. Jika tanggal akhir lebih awal dari tanggal mulai, hasilnya negatif.

Dengan kolom, Anda mendapat satu selisih per baris:

-- Input: orders
-- order_id | order_date | ship_date
-- ---------+------------+-----------
-- 1001     | 2026-02-02 | 2026-02-04
-- 1002     | 2026-02-03 | 2026-02-10
-- 1003     | 2026-02-27 | 2026-03-02
-- 1004     | 2026-03-05 | NULL

SELECT
  order_id,
  order_date,
  ship_date,
  DATEDIFF(day, order_date, ship_date) AS fulfillment_days
FROM orders;

-- Output:
-- order_id | order_date | ship_date  | fulfillment_days
-- ---------+------------+------------+-----------------
-- 1001     | 2026-02-02 | 2026-02-04 | 2
-- 1002     | 2026-02-03 | 2026-02-10 | 7
-- 1003     | 2026-02-27 | 2026-03-02 | 3
-- 1004     | 2026-03-05 | NULL       | NULL

Aturan yang perlu diketahui

  • Yang dihitung adalah batas, bukan satuan utuh. DATEDIFF(month, ...) menghitung batas bulan di antara kedua tanggal, jadi selisih satu hari saja bisa terhitung sebagai satu bulan, bahkan satu tahun:
SELECT DATEDIFF(month, '2026-01-31', '2026-02-01');
-- Output: 1

SELECT DATEDIFF(year, '2025-12-31', '2026-01-01');
-- Output: 1
  • NULL masuk, NULL keluar. Jika salah satu tanggal NULL, hasilnya juga NULL, seperti pesanan 1004 di atas. Bungkus pemanggilannya dengan COALESCE() jika Anda butuh nilai default.

Sintaks alternatif

MySQL punya DATEDIFF dengan dua argumen yang hanya menghitung hari dan menerima tanggal akhir lebih dulu. Untuk satuan lain, gunakan TIMESTAMPDIFF, yang menerima tanggal mulai lebih dulu dan menghitung satuan utuh:

SELECT DATEDIFF('2026-03-15', '2026-01-01');
-- Output: 73

SELECT TIMESTAMPDIFF(MONTH, '2026-01-01', '2026-03-15');
-- Output: 2

PostgreSQL tidak punya DATEDIFF. Kurangkan satu tanggal dari tanggal lain untuk mendapatkan jumlah hari. Untuk satuan yang lebih besar, AGE() (tanggal yang lebih akhir lebih dulu) mengembalikan interval dalam tahun, bulan, dan hari, lalu EXTRACT mengambil satuan utuh darinya:

SELECT DATE '2026-03-15' - DATE '2026-01-01';
-- Output: 73

SELECT AGE('2026-03-15', '2026-01-01');
-- Output: 2 mons 14 days

SELECT EXTRACT(YEAR FROM AGE('2026-03-15', '2026-01-01')) * 12
     + EXTRACT(MONTH FROM AGE('2026-03-15', '2026-01-01'));
-- Output: 2

SQLite juga tidak punya DATEDIFF. julianday() mengubah tanggal menjadi jumlah hari, jadi mengurangkan dua nilainya memberi selisihnya. CAST(... AS INTEGER) membuang pecahannya, dan karena tidak ada satuan bulan atau tahun, bagi dengan 30 atau 365 untuk perkiraan:

SELECT julianday('2026-03-15') - julianday('2026-01-01');
-- Output: 73.0

SELECT CAST((julianday('2026-03-15') - julianday('2026-01-01')) / 30 AS INTEGER);
-- Output: 2

-- The time of day counts: 8 p.m. to 8 a.m. is half a day.
-- Wrap each value in date() to count calendar days instead.
SELECT julianday('2026-03-16 08:00') - julianday('2026-03-15 20:00');
-- Output: 0.5

-- A date it can't read gives NULL, so store dates as YYYY-MM-DD
SELECT julianday('03/15/2026');
-- Output: NULL

Kapan sebaiknya menggunakan DATEDIFF?

Sebagian besar kebutuhan selisih tanggal masuk ke salah satu dari empat kategori ini.

Mengukur berapa lama sesuatu berlangsung

Kurangkan tanggal mulai dari tanggal akhir untuk mendapatkan durasi: berapa hari pengiriman pesanan, berapa minggu proyek berjalan, berapa menit panggilan support berlangsung.

Menghitung hari keterlambatan atau sisa waktu

Bandingkan tenggat dengan hari ini, atau dengan tanggal laporan tertentu, untuk melihat seberapa terlambat sesuatu atau berapa banyak waktu yang tersisa. Filter berdasarkan tanda hasilnya untuk mengambil salah satu sisi.

Menyatakan usia dalam bulan atau tahun

Usia akun, lama menjadi pelanggan, dan masa kerja butuh satuan yang lebih besar dari hari. Gunakan satuan bulan atau tahun jika database Anda menyediakannya. Di SQLite, bagi jumlah harinya.

Mencari baris dalam rentang waktu di sekitar suatu tanggal

Ambil nilai absolut dari selisihnya untuk mencari baris yang berada dalam sejumlah hari dari suatu tanggal, sebelum atau sesudahnya: event di sekitar peluncuran, login di sekitar insiden.

Contoh nyata DATEDIFF

Memeriksa tiket support terhadap SLA

Setiap tiket harus diselesaikan dalam tiga hari. Hitung berapa hari tiap tiket diselesaikan dan tandai yang melanggar (SQLite):

-- Input: support_tickets
-- ticket_id | created_at | resolved_at
-- ----------+------------+------------
-- 301       | 2026-03-02 | 2026-03-03
-- 302       | 2026-03-04 | 2026-03-07
-- 303       | 2026-03-05 | 2026-03-10

SELECT
  ticket_id,
  created_at,
  resolved_at,
  CAST(julianday(resolved_at) - julianday(created_at) AS INTEGER) AS resolution_days,
  CASE
    WHEN julianday(resolved_at) - julianday(created_at) <= 3 THEN 'Within SLA'
    ELSE 'SLA Breach'
  END AS sla_status
FROM support_tickets;

-- Output:
-- ticket_id | created_at | resolved_at | resolution_days | sla_status
-- ----------+------------+-------------+-----------------+-----------
-- 301       | 2026-03-02 | 2026-03-03  | 1               | Within SLA
-- 302       | 2026-03-04 | 2026-03-07  | 3               | Within SLA
-- 303       | 2026-03-05 | 2026-03-10  | 5               | SLA Breach

Menampilkan tagihan yang jatuh tempo

Tampilkan tagihan yang sudah lewat jatuh tempo, mulai dari yang paling lama terlambat (MySQL):

-- Input: invoices
-- invoice_id | customer      | due_date
-- -----------+---------------+-----------
-- 5001       | Acme Hardware | 2026-08-15
-- 5002       | Lumen Design  | 2026-09-30
-- 5003       | Acme Hardware | 2026-10-01
-- 5004       | Cedar Clinic  | 2026-10-31

SELECT
  invoice_id,
  customer,
  due_date,
  DATEDIFF(CURDATE(), due_date) AS days_overdue
FROM invoices
WHERE due_date < CURDATE()
ORDER BY days_overdue DESC;

-- Output (run on 2026-10-13):
-- invoice_id | customer      | due_date   | days_overdue
-- -----------+---------------+------------+-------------
-- 5001       | Acme Hardware | 2026-08-15 | 59
-- 5002       | Lumen Design  | 2026-09-30 | 13
-- 5003       | Acme Hardware | 2026-10-01 | 12

Mengelompokkan pelanggan berdasarkan lama berlangganan

Kelompokkan pelanggan ke dalam tingkatan berdasarkan lama mereka menjadi pelanggan dalam tahun penuh (PostgreSQL):

-- Input: customers
-- customer_name     | signup_date
-- ------------------+------------
-- Northwind Traders | 2022-11-05
-- Bluebird Bakery   | 2025-06-20
-- Fjord Outfitters  | 2025-12-20
-- Kestrel Labs      | 2026-03-02

SELECT
  customer_name,
  signup_date,
  EXTRACT(YEAR FROM AGE(CURRENT_DATE, signup_date)) AS years_with_us,
  CASE
    WHEN AGE(CURRENT_DATE, signup_date) < INTERVAL '1 year' THEN 'New'
    WHEN AGE(CURRENT_DATE, signup_date) < INTERVAL '2 years' THEN 'Established'
    ELSE 'Loyal'
  END AS customer_tier
FROM customers;

-- Output (run on 2026-10-13):
-- customer_name     | signup_date | years_with_us | customer_tier
-- ------------------+-------------+---------------+--------------
-- Northwind Traders | 2022-11-05  | 3             | Loyal
-- Bluebird Bakery   | 2025-06-20  | 1             | Established
-- Fjord Outfitters  | 2025-12-20  | 0             | New
-- Kestrel Labs      | 2026-03-02  | 0             | New

Mencari langganan yang akan diperpanjang

Tampilkan langganan yang berakhir dalam 30 hari ke depan, beserta sisa harinya (SQL Server). Klausa WHERE membandingkan subscription_end dengan rentang tanggal alih-alih membungkusnya dengan DATEDIFF, sehingga index pada kolom tersebut tetap bisa digunakan.

-- Input: subscriptions
-- customer_name    | subscription_end
-- -----------------+-----------------
-- Harbor Dental    | 2026-10-09
-- Maple Yoga       | 2026-10-20
-- Orbit Analytics  | 2026-11-07
-- Pinecrest Realty | 2027-01-15

SELECT
  customer_name,
  subscription_end,
  DATEDIFF(day, GETDATE(), subscription_end) AS days_remaining
FROM subscriptions
WHERE subscription_end BETWEEN CAST(GETDATE() AS date)
                           AND DATEADD(day, 30, CAST(GETDATE() AS date))
ORDER BY days_remaining;

-- Output (run on 2026-10-13):
-- customer_name   | subscription_end | days_remaining
-- ----------------+------------------+---------------
-- Maple Yoga      | 2026-10-20       | 7
-- Orbit Analytics | 2026-11-07       | 25

Bacaan lanjutan tentang DATEDIFF

Di blog ini:

Dokumentasi resmi:

Beekeeper Studio Adalah GUI Database Gratis & Open Source

Tool query & editor SQL terbaik yang pernah saya pakai. Semua yang saya butuhkan untuk mengelola database ada di sini. - ⭐⭐⭐⭐⭐ Mit

Beekeeper Studio cepat, intuitif, dan mudah digunakan. Beekeeper mendukung banyak sekali database, dan berjalan mulus di Windows, Mac, dan Linux.

Versi Linux Beekeeper punya fitur 100% lengkap, tanpa potong kompas, tanpa kompromi fitur.

Apa Kata Pengguna Tentang Beekeeper Studio

★★★★★
"Beekeeper Studio benar-benar menggantikan alur kerja SQL lama saya. Cepat, intuitif, dan membuat kerja dengan database kembali menyenangkan."
— Alex K., Database Developer
★★★★★
"Saya sudah mencoba banyak GUI database, tapi Beekeeper punya keseimbangan sempurna antara fitur dan kesederhanaan. Langsung jalan."
— Sarah M., Full Stack Engineer

Siap Meningkatkan Alur Kerja SQL Anda?

download Unduh Gratis