Fungsi NOW() Pada MySql

Halo! Kali ini kita akan membahas mengenai fungsi NOW() dalam MySQL. Mungkin kamu sudah sering melihat atau sekadar mendengar tentang fungsi ini, tetapi apakah kamu sudah memahami kegunaannya secara menyeluruh? Dalam artikel panjang dan (semoga) friendly ini, kita akan mengupas cara kerja, penerapan, serta berbagai contoh penggunaan NOW() dalam bermacam-macam kasus. Yuk, kita mulai!


Apa Itu Fungsi NOW()?

Pada dasarnya, NOW() adalah salah satu fungsi bawaan MySQL yang mengembalikan nilai tanggal dan waktu saat ini (current date and time) sesuai dengan pengaturan server tempat MySQL dijalankan. Fungsi ini sangat berguna untuk mencatat waktu ketika sebuah peristiwa terjadi, misalnya waktu data baru dimasukkan, diubah, atau bahkan dihapus dalam database.

Nilai yang dikembalikan oleh NOW() biasanya dalam format 'YYYY-MM-DD HH:MM:SS', misalnya '2025-12-31 23:59:59'. Format ini disebut DateTime format di MySQL. Dengan format yang standar ini, kita dapat dengan mudah melakukan operasi perbandingan maupun manipulasi terhadap nilai waktu. Jika kamu butuh sekadar melihat tanggal saja atau waktu saja, nantinya bisa menggunakan fungsi lain seperti DATE() atau TIME() yang diintegrasikan dengan NOW().


Bagaimana Cara Menggunakan NOW()?

Penerapannya sangat sederhana. Kapanpun kita mengeksekusi query MySQL, kita cukup memanggil NOW() untuk mendapatkan tanggal dan waktu terbaru. Contohnya, jika kita ingin menyimpan data ke dalam tabel beserta waktu saat data tersebut dimasukkan, kita bisa menggunakan sintaks berikut:


INSERT INTO nama_tabel (kolom_data, kolom_waktu)
VALUES ('data_terserah', NOW());

Setiap kali query di atas dijalankan, kolom_waktu akan otomatis berisi timestamp (tanggal dan waktu) terkini. Ini memudahkan kita untuk mencatat jejak (log) entri data secara real-time. Tak perlu khawatir soal format, karena MySQL akan secara otomatis menyesuaikan format datetime internalnya.


Format yang Dikembalikan NOW()

Seperti yang sudah disinggung, NOW() mengembalikan datetime dalam format standar MySQL, yaitu 'YYYY-MM-DD HH:MM:SS'. Misalnya, jika server MySQL saat ini menunjuk pada tanggal 15 Maret 2025 pukul 14:30:45, maka pemanggilan NOW() akan mengembalikan '2025-03-15 14:30:45'. Kita dapat mengubah format tampilan ini jika diperlukan, misalnya menggunakan fungsi DATE_FORMAT():


SELECT DATE_FORMAT(NOW(), '%d/%m/%Y %H:%i:%s') AS 'WaktuSaatIni';

Hasilnya mungkin akan berubah menjadi '15/03/2025 14:30:45', tergantung format yang kamu tentukan dalam DATE_FORMAT(). Dengan cara ini, kita bisa menampilkan hasil waktu sesuai gaya penulisan yang diinginkan.


Penerapan NOW() pada Berbagai Kasus

1. Mencatat Waktu Saat Menambah Data (Insert)

Kasus paling umum adalah menggunakan NOW() ketika memasukkan data baru ke dalam tabel. Contoh skenarionya begini: Misalkan kita punya tabel users yang memiliki kolom username, email, dan created_at. Kita ingin tahu kapan pengguna baru mendaftar. Kodenya kurang lebih seperti berikut:


CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100),
    created_at DATETIME
);

INSERT INTO users (username, email, created_at)
VALUES ('john_doe', 'john@example.com', NOW());

Setelah perintah di atas dieksekusi, created_at akan berisi waktu pendaftaran user john_doe sesuai waktu server. Hal ini sangat bermanfaat untuk pelacakan dan keperluan audit.

2. Merekam Waktu Saat Data Diperbarui (Update)

Banyak juga kasus di mana kita ingin menyimpan catatan kapan suatu data di-update atau diubah. Kita bisa menambahkan kolom updated_at di tabel kita, lalu setiap melakukan perintah UPDATE, cukup panggil NOW() pada kolom ini. Contohnya:


ALTER TABLE users ADD COLUMN updated_at DATETIME;

UPDATE users
SET email = 'john_new@example.com',
    updated_at = NOW()
WHERE user_id = 1;

Dengan pendekatan ini, setiap kali informasi user berubah, kita punya jejak updated_at yang selalu mutakhir. Bermanfaat untuk ngecek kapan terakhir data diperbarui, misalnya untuk kepentingan audit, versioning, atau sekadar menampilkan informasi “Terakhir diperbarui pada...”.

3. Menggunakan NOW() pada Default Value Kolom

Dalam beberapa versi MySQL, kita dapat menset nilai default pada kolom tipe DATETIME atau TIMESTAMP menjadi NOW(). Namun, perlu dicatat bahwa pengaturan default ini lebih fleksibel pada tipe data TIMESTAMP. Misalnya:


CREATE TABLE logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    message VARCHAR(255),
    log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Kolom log_time di atas akan otomatis berisi waktu saat kita melakukan INSERT tanpa perlu menuliskan NOW() secara eksplisit di query. Ini cocok dipakai pada situasi pencatatan log yang intens, seperti saat kita butuh kecepatan dan efisiensi tanpa berulang kali menambahkan NOW() di query.

4. Pemakaian dalam Trigger

Trigger adalah mekanisme di MySQL yang memungkinkan kita untuk menjalankan serangkaian aksi secara otomatis saat event tertentu terjadi (misalnya INSERT, UPDATE, atau DELETE). Fungsi NOW() sering sekali digunakan di dalam trigger untuk mencatat waktu event. Contohnya:


CREATE TRIGGER before_update_users
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
    SET NEW.updated_at = NOW();
END;

Dengan trigger ini, setiap kali ada UPDATE pada tabel users, updated_at akan diset ke NOW() secara otomatis. Sehingga, kita tidak perlu ingat-ingat lagi untuk menuliskan updated_at = NOW() setiap kali update terjadi.

5. Perbandingan Tanggal Menggunakan NOW()

Kita juga sering melakukan perbandingan tanggal dan waktu. Misalnya, kita ingin melihat data pengguna yang terakhir di-update dalam kurun waktu 7 hari terakhir. Kita bisa memanfaatkan fungsi NOW() dikombinasikan dengan perhitungan tanggal. Di MySQL, kita bisa menambahkan atau mengurangi interval waktu menggunakan fungsi semisal DATE_SUB atau DATE_ADD. Contohnya:


SELECT * FROM users
WHERE updated_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);

Query di atas akan menampilkan seluruh data yang memiliki updated_at lebih besar atau sama dengan 7 hari yang lalu dari waktu sekarang. Dengan kata lain, kita ingin tahu siapa saja yang updatenya terjadi dalam seminggu terakhir. Penggunaan NOW() di sini memudahkan karena kita tidak harus menghitung manual tanggal “hari ini” dan “7 hari yang lalu”.

6. Mengelola Zona Waktu (Time Zone)

Secara default, NOW() mengikuti zona waktu (time zone) yang disetel pada server MySQL. Jika servermu disetel ke UTC, maka hasil NOW() juga akan ada di UTC. Hal ini bisa menjadi sedikit membingungkan bila aplikasi kita digunakan secara internasional atau oleh pengguna dari zona waktu berbeda.

Dalam praktiknya, banyak pengembang memilih menjaga waktu di database dalam format UTC agar netral, lalu menyesuaikan tampilan di sisi aplikasi. Namun, jika kamu perlu mengubah pengaturan zona waktu di level sesi MySQL, kamu bisa menjalankan:


SET time_zone = 'Asia/Jakarta';

Setelah perintah ini, NOW() di sesi tersebut akan mengikuti zona waktu ‘Asia/Jakarta’. Ingat, untuk skala besar dan aplikasi global, penggunaan UTC sering kali dianggap praktik terbaik agar data waktu tidak membingungkan di antara berbagai lokasi.

7. Penggunaan untuk Logging dan Monitoring

Salah satu manfaat paling umum dari NOW() adalah untuk logging dan monitoring. Misalnya, jika kita memiliki tabel activity_logs yang mencatat semua aktivitas pengguna: apa yang dilakukan, kapan dilakukan, dan oleh siapa. Kita bisa mendesain tabel tersebut seperti berikut:


CREATE TABLE activity_logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    activity_desc VARCHAR(255),
    created_at DATETIME
);

INSERT INTO activity_logs (user_id, activity_desc, created_at)
VALUES (5, 'Login successful', NOW());

Dengan memanggil NOW() setiap kali kita menulis log, kita akan selalu tahu jam berapa suatu aktivitas terjadi. Jadi, kalau ada keperluan analisis atau pelacakan bug, kita bisa melihat tabel activity_logs dan langsung tahu timeline setiap kejadian.

8. Menggunakan NOW() dalam Stored Procedure

Stored procedure adalah sekumpulan perintah SQL yang disimpan dalam database dan bisa dipanggil berulang kali seperti fungsi. NOW() juga bisa kita gunakan di dalam stored procedure untuk menangani logika yang memerlukan data waktu. Misalnya, kita punya stored procedure untuk menambahkan pengguna baru dan mencatat waktu pendaftarannya:


DELIMITER $$

CREATE PROCEDURE sp_add_new_user (
    IN p_username VARCHAR(50),
    IN p_email VARCHAR(100)
)
BEGIN
    INSERT INTO users (username, email, created_at)
    VALUES (p_username, p_email, NOW());
END $$

DELIMITER ;

Dengan prosedur ini, cukup panggil CALL sp_add_new_user('alex', 'alex@example.com'); lalu secara otomatis created_at akan diisi dengan NOW(). Ini sangat praktis untuk menjaga konsistensi waktu saat kita memiliki proses yang kompleks, karena semuanya diatur di satu tempat, yakni di dalam stored procedure.

9. Membuat Soft Delete dengan Kolom deleted_at

Ada kalanya kita tidak ingin benar-benar menghapus data, tetapi kita sekadar menandai bahwa data tersebut sudah dihapus atau tidak aktif. Teknik ini disebut soft delete. Kita bisa menambahkan kolom deleted_at pada tabel, dan saat data “dihapus” (soft delete), kita cukup set kolom deleted_at ke NOW(). Contoh:


ALTER TABLE users ADD COLUMN deleted_at DATETIME NULL DEFAULT NULL;

UPDATE users
SET deleted_at = NOW()
WHERE user_id = 5;

Jika deleted_at bernilai NULL, berarti data masih aktif, dan kalau kolomnya sudah diisi waktu tertentu, berarti data tersebut sudah tidak aktif. Dengan cara ini, kita bisa kapan saja melakukan restore kalau ternyata dibutuhkan kembali.

10. Penggunaan NOW() untuk Validasi Data dan Notifikasi

Bayangkan skenario di mana kita memiliki sistem peminjaman buku di perpustakaan, di mana sistem akan mengirim notifikasi kalau peminjam telah melewati tenggat (deadline). Kita punya tabel borrowings yang mencatat due_date (tanggal jatuh tempo) dan returned_date (tanggal pengembalian). Dengan NOW(), kita dapat dengan cepat mengecek siapa saja yang belum mengembalikan buku padahal sudah lewat dari due_date. Contohnya:


SELECT * FROM borrowings
WHERE returned_date IS NULL
  AND due_date < NOW();

Query di atas menampilkan semua peminjaman yang belum dikembalikan (karena returned_date IS NULL) dan sudah lewat dari due_date jika dibandingkan dengan NOW(). Dengan informasi ini, kita bisa segera mengirim notifikasi agar peminjam mengembalikan buku. Inilah salah satu contoh nyata pemanfaatan NOW() dalam validasi dan notifikasi.


Keunggulan dan Perhatian dalam Menggunakan NOW()

Dalam praktiknya, NOW() memang sangat mudah dipakai dan bermanfaat. Namun, kita perlu memahami beberapa hal penting:

  1. Konsistensi Waktu: Jika aplikasi kamu berjalan pada beberapa server yang berbeda zona waktu, pastikan semua mencatat data menggunakan waktu yang sama (misalnya UTC), agar data di database konsisten.
  2. Performa Query: Pemanggilan NOW() itu tergolong ringan, tetapi kalau kamu memanggilnya sangat banyak (misalnya dalam loop di aplikasi), hal ini tetap bisa menambah sedikit beban. Biasanya bukan masalah besar, tapi tetap perlu diperhatikan pada skala besar.
  3. Ketepatan Data: NOW() sangat bergantung pada jam server. Jika jam server tidak tepat atau berbeda beberapa detik/menit dengan waktu aktual, maka data yang dihasilkan juga akan mengikuti ketidaktepatan tersebut.
  4. Versi MySQL: Beberapa fitur seperti default value NOW() mungkin memiliki perilaku berbeda antara tipe DATETIME dan TIMESTAMP, dan juga antara versi MySQL satu dengan yang lain. Periksa dokumentasi sesuai versi MySQL yang kamu gunakan.

Mengetahui hal-hal di atas akan membantu kita memanfaatkan fungsi NOW() secara lebih bijak dan menghindari pitfall yang mungkin terjadi di kemudian hari.


Praktik Terbaik (Best Practices)

  1. Simpan dalam UTC Jika Bisa
    Banyak pakar database yang merekomendasikan menyimpan semua data waktu dalam format UTC untuk menghindari kebingungan lintas zona waktu. Setelah data masuk ke aplikasi, barulah kita lakukan konversi sesuai zona waktu pengguna.
  2. Gunakan Trigger untuk Otomatisasi
    Jika memiliki banyak tabel yang memerlukan update waktu ketika data berubah, pertimbangkan untuk menggunakan trigger agar mengurangi human error. Namun, perhatikan performa trigger karena pada volume data yang sangat besar, hal ini bisa menambah overhead.
  3. Tambahkan Kolom created_at dan updated_at
    Hampir di setiap tabel yang menyimpan data penting, menambahkan kolom created_at dan updated_at adalah praktik yang baik. Dengan begitu, kita selalu punya catatan kapan sebuah baris dibuat dan terakhir diubah.
  4. Gunakan Tipe Data yang Tepat
    Meskipun DATETIME dan TIMESTAMP sama-sama bisa menampung informasi tanggal dan waktu, ada perbedaan batas rentang serta perilaku time zone. Pahami kebutuhan aplikasi sebelum memutuskan mana yang cocok.

Contoh Skenario Lengkap

Sebagai penutup bagian contoh, bayangkan kita sedang membuat mini project aplikasi catatan harian (journal app). Kita memiliki tabel entries dengan kolom: entry_id, title, content, created_at, updated_at, dan deleted_at. Secara skematis, kita bisa merancang tabel ini seperti berikut:


CREATE TABLE entries (
    entry_id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    created_at DATETIME DEFAULT NOW(),
    updated_at DATETIME,
    deleted_at DATETIME
);

Lalu kita tambahkan satu trigger untuk mengisi updated_at setiap kali ada UPDATE, agar kita tidak perlu menuliskannya berulang-ulang:


CREATE TRIGGER before_update_entries
BEFORE UPDATE ON entries
FOR EACH ROW
BEGIN
    SET NEW.updated_at = NOW();
END;

Untuk memasukkan data baru, cukup panggil:


INSERT INTO entries (title, content)
VALUES ('Judul Pertama', 'Isi konten catatan harian...');

Karena kita sudah memberikan DEFAULT NOW() di kolom created_at, maka kolom tersebut otomatis terisi waktu saat data baru masuk. Kemudian, jika kita meng-update isi konten:


UPDATE entries
SET content = 'Perubahan isi catatan...',
    title   = 'Judul Diperbarui'
WHERE entry_id = 1;

Maka, updated_at akan otomatis berubah sesuai waktu terkini, berkat trigger yang kita buat tadi. Dan kalau kita ingin “menghapus” secara soft delete, kita set deleted_at:


UPDATE entries
SET deleted_at = NOW()
WHERE entry_id = 1;

Voila! Data sudah “terhapus”, tapi kita masih punya arsip lengkapnya. Dengan begini, seluruh alur pemrosesan waktu dari mulai pembuatan, perubahan, hingga penghapusan pun tercatat rapi.


Catatan Penting

Fungsi NOW() di MySQL adalah salah satu fungsi yang paling sering kita gunakan dalam pengelolaan database, terutama ketika kita membutuhkan informasi waktu secara real-time. Namun, pemahaman yang mendalam mengenai pengaturan zona waktu, perilaku default, dan integrasi dengan sistem aplikasi sangat diperlukan agar pemanfaatannya lebih optimal. Baik untuk logging, audit trail, notifikasi, atau hanya sekadar mencatat waktu insert—semuanya bisa dilakukan dengan memanggil NOW(). Dengan memperhatikan konsistensi waktu, penggunaan trigger yang tepat, dan praktik terbaik lainnya, kita bisa memastikan aplikasi berjalan lancar dan data waktu pun tercatat dengan benar.


Baca Juga :