Perbandingan dan Manipulasi Tanggal MySQL: Panduan Lengkap dengan Contoh & Tips Kinerja

1. Introduction

Handling dates in MySQL is one of the most important aspects of database operations. For example, when aggregating sales data by date or searching records within a specific period, date comparison becomes essential.

This article explains everything from the basics of date manipulation and comparison in MySQL to advanced use cases and performance optimization techniques. It is designed to be useful for users at all levels, from beginners to intermediate developers.

2. Overview of MySQL Date Data Types

Types of Date Data Types and Their Characteristics

MySQL provides the following three main date data types. Below is a brief explanation of each.

  1. DATE
  • Stored Value: Year-Month-Day ( YYYY-MM-DD )
  • Characteristics: Does not include time information, making it suitable for managing simple dates.
  • Use Cases: Birthdays, deadlines.
  1. DATETIME
  • Stored Value: Year-Month-Day and Time ( YYYY-MM-DD HH:MM:SS )
  • Characteristics: Includes time information, making it suitable for recording precise timestamps.
  • Use Cases: Creation timestamps, last updated timestamps.
  1. TIMESTAMP
  • Stored Value: Year-Month-Day and Time ( YYYY-MM-DD HH:MM:SS )
  • Characteristics: Time zone dependent, making it useful for managing date and time across different regions.
  • Use Cases: Log data, transaction records.

How to Choose the Appropriate Data Type

  • If time is not required, choose DATE .
  • If time is required, choose DATETIME or TIMESTAMP depending on your application’s time zone requirements.

Sample Query

Below is an example using each data type.

CREATE TABLE events (
    event_id INT AUTO_INCREMENT PRIMARY KEY,
    event_date DATE,
    event_datetime DATETIME,
    event_timestamp TIMESTAMP
);

3. How to Compare Dates

Using Basic Comparison Operators

In MySQL, the following operators are used for date comparison.

  1. = (Equal)
  • Retrieves records that match the specified date.
    SELECT * FROM events WHERE event_date = '2025-01-01';
    
  1. > / < (Greater Than / Less Than)
  • Searches for records before or after the specified date.
    SELECT * FROM events WHERE event_date > '2025-01-01';
    
  1. <= / >= (Less Than or Equal / Greater Than or Equal)
  • Searches within a range that includes the specified date.
    SELECT * FROM events WHERE event_date <= '2025-01-10';
    

Range Queries Using BETWEEN

The BETWEEN operator allows you to easily specify a date range.

SELECT * FROM events 
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-31';

Important Note:

  • BETWEEN includes both the start and end values, so make sure no required data is unintentionally excluded from your range.

4. Calculating Date Differences

Using the DATEDIFF Function

The DATEDIFF() function calculates the difference (in days) between two dates.

SELECT DATEDIFF('2025-01-10', '2025-01-01') AS days_difference;

Result:

  • 9 days

Using the TIMESTAMPDIFF Function

The TIMESTAMPDIFF() function allows you to calculate the difference in specific units such as years, months, days, or hours.

SELECT TIMESTAMPDIFF(MONTH, '2025-01-01', '2025-12-31') AS months_difference;

Result:

  • 11 months

5. Date Addition and Subtraction

Date Manipulation Using the INTERVAL Clause

In MySQL, you can easily add or subtract time from a date using the INTERVAL clause. This allows you to create queries that retrieve dates before or after a specific period.

Adding to a Date

Example of adding time to a date using INTERVAL:

SELECT DATE_ADD('2025-01-01', INTERVAL 7 DAY) AS plus_seven_days;

Result:
2025-01-08

Subtracting from a Date

You can subtract time from a date in a similar way using INTERVAL:

SELECT DATE_SUB('2025-01-01', INTERVAL 1 MONTH) AS minus_one_month;

Hasil:
2024-12-01

Kasus Penggunaan: Sistem Pengingat

Di bawah ini adalah contoh kueri yang mengambil peristiwa yang terjadi tepat tujuh hari yang lalu, yang dapat digunakan untuk mengirim notifikasi pengingat otomatis.

SELECT event_name, event_date 
FROM events 
WHERE event_date = DATE_SUB(CURDATE(), INTERVAL 7 DAY);

Perhitungan Berdasarkan Tanggal Saat Ini

  • CURDATE() : Mengembalikan tanggal saat ini (YYYY-MM-DD).
  • NOW() : Mengembalikan tanggal dan waktu saat ini (YYYY-MM-DD HH:MM:SS).

Contoh: Hitung tanggal satu minggu dari hari ini.

SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY) AS next_week;

6. Contoh Kueri Praktis

Mengambil Rekaman untuk Tanggal Tertentu

Ambil peristiwa yang cocok dengan tanggal yang ditentukan.

SELECT * 
FROM events 
WHERE event_date = '2025-01-01';

Mengambil Data Dalam Rentang Tanggal

Contoh pencarian peristiwa dalam rentang satu minggu.

SELECT * 
FROM events 
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-07';

Mengagregasi Data berdasarkan Tanggal

Kueri ini menghitung berapa banyak peristiwa yang terdaftar untuk setiap bulan.

SELECT MONTH(event_date) AS event_month, COUNT(*) AS total_events 
FROM events 
GROUP BY MONTH(event_date);

Hasil Contoh:

event_monthtotal_events
110
215

7. Optimasi Performa

Pencarian Efisien Menggunakan Indeks

Membuat indeks pada kolom tanggal dapat meningkatkan performa kueri secara signifikan.

Membuat Indeks

SQL berikut membuat indeks pada kolom event_date.

CREATE INDEX idx_event_date ON events(event_date);

Memeriksa Efek Indeks

Anda dapat menggunakan EXPLAIN untuk memeriksa rencana eksekusi kueri.

EXPLAIN SELECT * 
FROM events 
WHERE event_date = '2025-01-01';

Catatan Penting Saat Menggunakan Fungsi

Menggunakan fungsi dalam klausa WHERE dapat menonaktifkan penggunaan indeks.

Contoh Buruk

Dalam kueri berikut, fungsi DATE() mencegah penggunaan indeks.

SELECT * 
FROM events 
WHERE DATE(event_date) = '2025-01-01';

Contoh yang Diperbaiki

Disarankan untuk membandingkan nilai secara langsung tanpa menggunakan fungsi.

SELECT * 
FROM events 
WHERE event_date >= '2025-01-01' 
  AND event_date < '2025-01-02';

8. FAQ (Pertanyaan yang Sering Diajukan)

Q1: Apa perbedaan antara DATE dan DATETIME?

  • A1:
  • DATE: Hanya menyimpan tanggal ( YYYY-MM-DD ). Gunakan ketika informasi waktu tidak diperlukan.
  • DATETIME: Menyimpan tanggal dan waktu ( YYYY-MM-DD HH:MM:SS ). Gunakan ketika timestamp tepat dari suatu peristiwa diperlukan.

Contoh:

CREATE TABLE examples (
    example_date DATE,
    example_datetime DATETIME
);

Q2: Apa yang harus saya perhatikan saat menentukan rentang tanggal menggunakan BETWEEN?

  • A2:
  • Karena BETWEEN mencakup tanggal mulai dan akhir, jika tanggal akhir tidak mencakup nilai waktu, Anda mungkin tidak mengambil semua rekaman yang dimaksud.

Contoh:

-- This query may not retrieve records such as "2025-01-31 23:59:59"
SELECT * 
FROM events 
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-31';

Perbaikan:
Atur waktu akhir secara eksplisit ke 23:59:59 atau gunakan perbandingan yang mengabaikan bagian waktu.

SELECT * 
FROM events 
WHERE event_date >= '2025-01-01' AND event_date < '2025-02-01';

Q3: Bagaimana menangani perbedaan zona waktu?

  • A3: Di MySQL, tipe TIMESTAMP bergantung pada zona waktu. Sebaliknya, tipe DATETIME menyimpan nilai tetap dan tidak terpengaruh oleh zona waktu.

Periksa pengaturan zona waktu saat ini:

SHOW VARIABLES LIKE 'time_zone';

Ubah pengaturan zona waktu:

SET time_zone = '+09:00'; -- Japan Standard Time (JST)

Q4: Bagaimana saya bisa mengambil data dari 30 hari yang lalu?

  • A4: Anda dapat menggabungkan CURDATE() atau NOW() dengan INTERVAL untuk mengambil data dari 30 hari yang lalu.

Contoh:

SELECT * 
FROM events 
WHERE event_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);

Q5: Bagaimana cara meningkatkan kinerja perbandingan tanggal?

  • A5:
  • Buat indeks: Tetapkan indeks pada kolom tanggal.
  • Hindari penggunaan fungsi: Menggunakan fungsi dalam klausa WHERE dapat menonaktifkan indeks, jadi gunakan perbandingan langsung sebagai gantinya.

9. Ringkasan

Poin Penting Artikel Ini

Artikel ini memberikan penjelasan komprehensif tentang manipulasi tanggal dan teknik perbandingan di MySQL. Poin-poin utama adalah sebagai berikut:

  1. Memahami karakteristik dan penggunaan yang tepat dari tipe data tanggal (DATE, DATETIME, TIMESTAMP).
  2. Metode perbandingan dasar ( = , > , < , BETWEEN , dll.).
  3. Menghitung selisih tanggal ( DATEDIFF() , TIMESTAMPDIFF() ).
  4. Meningkatkan kinerja melalui pengindeksan dan desain kueri yang optimal.

Kami harap panduan ini membantu Anda menangani operasi tanggal di MySQL secara efisien dan mengembangkan kueri yang praktis serta dioptimalkan untuk aplikasi dunia nyata.