MySQL TIMESTAMP: Pengertian, Perbedaan dengan DATETIME, dan Contoh Penggunaan

1. Apa itu timestamp MySQL?

Tipe data TIMESTAMP di MySQL digunakan untuk menyimpan waktu tertentu dalam format UTC (Coordinated Universal Time) dan secara otomatis memperhitungkan zona waktu saat disimpan maupun diambil. Tipe data ini dapat menangani tanggal dan waktu dalam rentang 1 Januari 1970 hingga 19 Januari 2038. Saat disimpan ke dalam database, TIMESTAMP menggunakan zona waktu saat ini, lalu saat diambil akan otomatis dikonversi kembali berdasarkan zona waktu sistem.

Perbedaan antara TIMESTAMP dan DATETIME

TIMESTAMP sering dibandingkan dengan tipe data DATETIME. DATETIME menyimpan tanggal dan waktu dalam format asli tanpa mempertimbangkan zona waktu. Sebaliknya, TIMESTAMP dikonversi ke UTC saat penyimpanan dan dikembalikan ke zona waktu sistem saat diambil, sehingga dapat mencegah pergeseran waktu.

Misalnya, TIMESTAMP sangat berguna dalam migrasi sistem atau ketika mengelola database yang tersebar di beberapa zona waktu. Sementara itu, DATETIME dapat menyimpan tanggal dari tahun 1000 hingga 9999 sehingga sering dipakai untuk menghindari masalah tahun 2038.

Contoh penggunaan TIMESTAMP

Anda dapat membuat tabel dengan TIMESTAMP seperti berikut:

CREATE TABLE events (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Pada contoh ini, kolom event_time secara otomatis menyimpan waktu saat record dimasukkan, dan akan diperbarui setiap kali record tersebut di-update.

2. Cara dasar penggunaan timestamp

Saat menggunakan TIMESTAMP di MySQL, penting untuk memahami cara dasar menyisipkan dan mengambil data. Berikut adalah beberapa metode penggunaan TIMESTAMP.

Menyisipkan tanggal dan waktu

Untuk menyimpan data dalam kolom TIMESTAMP, biasanya digunakan format string. Format tanggal adalah “YYYY-MM-DD” dan format waktu adalah “hh:mm:ss”.

INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');

Pernyataan SQL ini menyimpan tanggal 1 Oktober 2023 pukul 12:30 ke dalam kolom event_time.

Menyisipkan waktu saat ini

Dengan fungsi NOW() di MySQL, Anda dapat mengambil tanggal dan waktu saat ini berdasarkan zona waktu sistem, lalu langsung menyimpannya ke dalam TIMESTAMP.

INSERT INTO events (event_time) VALUES (NOW());

Pada contoh ini, waktu saat SQL dijalankan akan otomatis disisipkan.

Menggunakan fitur pembaruan otomatis

Jika Anda menambahkan ON UPDATE CURRENT_TIMESTAMP ke kolom TIMESTAMP, maka waktu pembaruan akan tercatat secara otomatis setiap kali record di-update.

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Pada tabel ini, order_time akan otomatis menyimpan waktu saat record dibuat, dan akan diperbarui setiap kali terjadi update.

3. Penanganan timestamp dan zona waktu

Salah satu fitur utama dari TIMESTAMP adalah pertimbangan zona waktu. Data yang disimpan selalu dikonversi ke format UTC, lalu saat diambil dari database, dikonversi kembali sesuai dengan zona waktu sistem.

Cara memeriksa pengaturan zona waktu

Di MySQL, Anda dapat mengatur zona waktu per server maupun per sesi. Untuk memeriksa pengaturan zona waktu, gunakan perintah SHOW VARIABLES berikut:

SHOW VARIABLES LIKE 'time_zone';

Perintah ini menampilkan zona waktu yang sedang digunakan database. Untuk mengubah zona waktu, gunakan perintah berikut:

SET time_zone = '+09:00';

Perbedaan zona waktu pada TIMESTAMP dan DATETIME

Tipe DATETIME menyimpan tanggal dan waktu tanpa mempertimbangkan zona waktu, sedangkan TIMESTAMP dikonversi ke UTC saat disimpan. Oleh karena itu, dalam sistem yang menggunakan banyak zona waktu, TIMESTAMP lebih sesuai.

4. Masalah tahun 2038 dan dampaknya

Masalah tahun 2038 terjadi karena keterbatasan tipe TIMESTAMP pada sistem 32-bit. TIMESTAMP di MySQL dihitung sebagai jumlah detik sejak 1 Januari 1970 00:00:00 UTC. Pada 19 Januari 2038 pukul 03:14:07 UTC, nilai ini akan overflow.

Cara menghindari masalah 2038

Untuk menghindarinya, disarankan menggunakan sistem 64-bit atau tipe DATETIME yang memiliki jangkauan lebih luas. DATETIME dapat menyimpan tanggal dari tahun 1000 hingga 9999 sehingga tetap aman setelah 2038.

Selain itu, upgrade sistem ke 64-bit juga menyelesaikan masalah ini, karena sistem 64-bit tidak terpengaruh oleh masalah tahun 2038.

5. Contoh penerapan tipe timestamp

Tipe TIMESTAMP tidak hanya digunakan untuk menyimpan tanggal dan waktu dasar, tetapi juga untuk mencatat waktu secara otomatis saat record dibuat atau diperbarui. Berikut beberapa contoh penerapan.

Menyisipkan waktu saat ini secara otomatis

Jika Anda menetapkan CURRENT_TIMESTAMP sebagai nilai default pada kolom TIMESTAMP, maka setiap record baru akan otomatis menyimpan waktu saat dibuat.

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Mencatat waktu pembaruan secara otomatis

Dengan menambahkan ON UPDATE CURRENT_TIMESTAMP, waktu pembaruan akan otomatis tercatat setiap kali record di-update.

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Menggunakan beberapa kolom TIMESTAMP

MySQL memungkinkan adanya beberapa kolom TIMESTAMP dalam satu tabel, tetapi hanya satu yang dapat menggunakan CURRENT_TIMESTAMP sebagai default. Jika ingin mencatat beberapa waktu secara otomatis, gunakan kombinasi dengan DATETIME atau tetapkan nilainya secara manual.

CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

6. Hal-hal yang perlu diperhatikan saat menggunakan tipe timestamp

Saat menggunakan TIMESTAMP, ada beberapa hal penting yang perlu dipahami agar tidak terjadi inkonsistensi data atau error.

Keterbatasan NULL dan nilai default

Secara default, kolom TIMESTAMP menggunakan NOT NULL. Untuk mengizinkan nilai NULL, Anda harus menetapkannya secara eksplisit dengan DEFAULT NULL.

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    log_time TIMESTAMP DEFAULT NULL
);

Anda juga bisa menggunakan DEFAULT 0 yang akan menghasilkan nilai 0000-00-00 00:00:00, namun pengaturan ini tidak disarankan karena dapat menyebabkan error pada mode SQL ketat.

Masalah dengan 0000-00-00 00:00:00

Beberapa versi MySQL mendukung nilai 0000-00-00 00:00:00, namun ini bisa menimbulkan masalah dalam praktik. Untuk menjaga konsistensi data, lebih baik gunakan NULL atau default yang valid.

CREATE TABLE sessions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    end_time TIMESTAMP NULL
);

Pengaruh zona waktu sistem

Karena TIMESTAMP disimpan dalam UTC, perubahan zona waktu server dapat memengaruhi hasil yang ditampilkan. Oleh sebab itu, penting untuk mengelola zona waktu dengan benar.

SET time_zone = 'Asia/Tokyo';

Dengan perintah ini, zona waktu database diatur ke Tokyo untuk memastikan konversi dari UTC dilakukan dengan tepat.

7. Ringkasan dan rekomendasi

TIMESTAMP adalah tipe data yang kuat di MySQL untuk mengelola tanggal dan waktu secara efisien. Fitur utamanya adalah konversi otomatis berdasarkan zona waktu serta pencatatan waktu pembuatan dan pembaruan record. Namun, penting juga memahami keterbatasannya seperti masalah tahun 2038 dan aturan nilai NULL.

Rekomendasi penggunaan TIMESTAMP

  • Untuk pencatatan otomatis, gunakan TIMESTAMP, terutama jika ingin menyimpan waktu pembaruan setiap kali record berubah.
  • Untuk sistem multi-zona waktu, TIMESTAMP sangat berguna karena otomatis dikonversi berdasarkan UTC.
  • Namun, jika membutuhkan jangka waktu yang lebih panjang atau data setelah tahun 2038, pertimbangkan untuk menggunakan DATETIME.

Pada akhirnya, gunakan TIMESTAMP dan DATETIME sesuai kebutuhan sistem untuk menjaga konsistensi dan kemudahan pemeliharaan.

8. Pertanyaan yang sering diajukan (FAQ)

Banyak developer menghadapi masalah atau kebingungan dengan TIMESTAMP. Berikut adalah beberapa pertanyaan yang umum muncul beserta jawabannya.

Bagaimana sebaiknya membedakan penggunaan TIMESTAMP dan DATETIME?

TIMESTAMP cocok untuk aplikasi yang mempertimbangkan zona waktu atau membutuhkan pencatatan otomatis saat record dibuat/diubah. Sedangkan DATETIME lebih sesuai jika Anda ingin menyimpan waktu apa adanya tanpa pengaruh zona waktu.

Apakah benar TIMESTAMP tidak bisa dipakai setelah tahun 2038?

Benar, masalah tahun 2038 terkait dengan tipe TIMESTAMP pada sistem 32-bit. Untuk mengatasinya, gunakan sistem 64-bit atau tipe DATETIME yang mendukung rentang lebih luas.

Bagaimana cara mengizinkan nilai NULL pada kolom TIMESTAMP?

Anda harus menetapkan DEFAULT NULL secara eksplisit, misalnya:

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    log_time TIMESTAMP DEFAULT NULL
);

Apakah perubahan zona waktu memengaruhi data TIMESTAMP yang sudah ada?

Data TIMESTAMP disimpan dalam UTC, sehingga jika zona waktu diubah, hasil yang ditampilkan akan ikut berubah meski data asli tetap sama. Untuk konsistensi, pastikan seluruh sistem menggunakan pengaturan zona waktu yang seragam.

Apakah CURRENT_TIMESTAMP mencegah penyisipan waktu tertentu?

Tidak. CURRENT_TIMESTAMP otomatis menyisipkan waktu saat record dibuat, tetapi Anda tetap bisa menyisipkan waktu tertentu secara manual dengan format string atau menggunakan NOW().

INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');

Dengan demikian, Anda bisa fleksibel antara penyisipan otomatis maupun manual.