Panduan Waktu Saat Ini MySQL: NOW(), CURRENT_TIMESTAMP, DATE_FORMAT, Pengaturan Zona Waktu & Praktik Terbaik

目次

1. Pendahuluan

Kapan Anda Perlu Menangani Waktu Saat Ini di MySQL?

Di MySQL, mengambil waktu saat ini diperlukan dalam banyak skenario yang berbeda. Misalnya, kasus penggunaan berikut umum:

  • Secara otomatis menyisipkan cap waktu saat mendaftarkan data
  • Misalnya, merekam tanggal dan waktu pembuatan saat menyimpan data pesanan atau data log.
  • Menyaring data berdasarkan waktu saat ini
  • Misalnya, mengambil hanya data dari 7 hari terakhir atau mencari catatan dengan tanggal di masa depan.
  • Memformat tanggal dan waktu untuk ditampilkan
  • Memformat nilai tanggal dan waktu untuk keterbacaan yang lebih baik saat menghasilkan laporan.
  • Mengelola kedaluwarsa data menggunakan waktu saat ini
  • Misalnya, menentukan apakah kupon masih berlaku dengan membandingkannya dengan waktu saat ini.

Seperti yang Anda lihat, mengambil dan memanipulasi waktu saat ini dengan benar di MySQL adalah keterampilan penting dalam manajemen basis data.

Apa yang Akan Anda Pelajari dalam Artikel Ini

Artikel ini menjelaskan topik-topik berikut secara detail:

  • Cara mengambil waktu saat ini di MySQL (NOW(), CURRENT_TIMESTAMP, dll.)
  • Cara mengubah format tanggal dan waktu (menggunakan DATE_FORMAT())
  • Perhitungan tanggal dan waktu menggunakan waktu saat ini (menggunakan INTERVAL)
  • Cara mengubah zona waktu (SET SESSION time_zone)
  • Menggunakan waktu saat ini sebagai nilai default (CURRENT_TIMESTAMP)
  • Kesalahan umum dan cara memperbaikinya (FAQ)

Dari dasar hingga penggunaan lanjutan dalam menangani “waktu saat ini” di MySQL, panduan ini menyediakan contoh SQL praktis. Pastikan untuk membaca sampai akhir.

2. Cara Mengambil Waktu Saat Ini di MySQL

Daftar Fungsi untuk Mengambil Waktu Saat Ini di MySQL

MySQL menyediakan beberapa fungsi untuk mengambil waktu saat ini. Pahami perbedaannya dan gunakan secara tepat.

FunctionReturnsExample
NOW()Current date and time (date + time)SELECT NOW();2025-02-11 16:00:00
CURRENT_TIMESTAMPSame as NOW() (SQL standard)SELECT CURRENT_TIMESTAMP;
CURDATE()Current date onlySELECT CURDATE();2025-02-11
CURTIME()Current time onlySELECT CURTIME();16:00:00

Fungsi NOW()

NOW() adalah fungsi yang paling umum digunakan di MySQL untuk mengambil waktu saat ini.
Ia mengembalikan baik tanggal maupun waktu.

SELECT NOW();

Contoh output:

2025-02-11 16:00:00
  • NOW() mengembalikan waktu sistem saat ini.
  • Karena dipengaruhi oleh zona waktu, waktu yang ditampilkan dapat berbeda tergantung pada lingkungan Anda (dijelaskan secara detail di bagian “Pengaturan Zona Waktu”).

Cara Menggunakan CURRENT_TIMESTAMP

CURRENT_TIMESTAMP berperilaku hampir sama dengan NOW(). Ia sesuai dengan standar SQL dan juga dapat digunakan di basis data lain.

SELECT CURRENT_TIMESTAMP;

Contoh output:

2025-02-11 16:00:00

Dapatkan Hanya Tanggal dengan CURDATE()

CURDATE() digunakan ketika Anda ingin mengambil hanya tanggal saat ini (tahun, bulan, hari).

SELECT CURDATE();

Contoh output:

2025-02-11

Dapatkan Hanya Waktu dengan CURTIME()

Jika Anda ingin mengambil hanya waktu saat ini (jam, menit, detik), gunakan CURTIME().

SELECT CURTIME();

Contoh output:

16:00:00

Fungsi Mana yang Harus Anda Gunakan?

PurposeRecommended Function
Retrieve both date and timeNOW() or CURRENT_TIMESTAMP
Retrieve date onlyCURDATE()
Retrieve time onlyCURTIME()

3. Cara Memformat Waktu Saat Ini di MySQL

Pemformatan Kustom dengan DATE_FORMAT()

Sintaks Dasar DATE_FORMAT()

Di MySQL, Anda dapat menggunakan fungsi DATE_FORMAT() untuk mengubah format tanggal dan waktu secara bebas.

SELECT DATE_FORMAT(datetime_value, 'format_specifiers');

Contoh: Mengonversi NOW() ke format YYYY/MM/DD HH:MM

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

Output:

2025/02/11 16:45

Daftar Penentu Format Umum

SpecifierMeaningExample (2025-02-11 16:45:30)
%Y4-digit year2025
%m2-digit month (01-12)02
%d2-digit day (01-31)11
%HHour (00-23, 24-hour format)16
%iMinutes (00-59)45
%sSeconds (00-59)30

Ekstrak Hanya Bagian Waktu dengan TIME()

Jika Anda ingin mengekstrak hanya bagian waktu dari datetime yang dikembalikan oleh NOW(), gunakan fungsi TIME().

SELECT TIME(NOW());

Output:

16:45:30

Ekstrak Bagian dengan YEAR(), MONTH(), dan DAY()

Untuk mengekstrak hanya bagian tertentu, gunakan fungsi-fungsi berikut.

FunctionReturnsSQLOutput Example (2025-02-11 16:45:30)
YEAR()YearSELECT YEAR(NOW());2025
MONTH()MonthSELECT MONTH(NOW());2
DAY()DaySELECT DAY(NOW());11

Contoh Praktis Pemformatan

SQL berikut berguna untuk mencoba berbagai format dalam praktik.

SELECT 
    NOW() AS 'Original datetime',
    DATE_FORMAT(NOW(), '%Y/%m/%d') AS 'YYYY/MM/DD format',
    DATE_FORMAT(NOW(), '%H:%i:%s') AS 'HH:MM:SS',
    TIME(NOW()) AS 'Time only',
    YEAR(NOW()) AS 'Year',
    MONTH(NOW()) AS 'Month',
    DAY(NOW()) AS 'Day';

4. Perhitungan Tanggal/Waktu Menggunakan Waktu Saat Ini di MySQL

Tambah/Kurang dengan INTERVAL

Sintaks Dasar

SELECT current_datetime + INTERVAL number unit;
SELECT current_datetime - INTERVAL number unit;

Tambah Waktu Berdasarkan NOW()

Sebagai contoh, untuk mengambil datetime “satu minggu kemudian”:

SELECT NOW() + INTERVAL 7 DAY;

Contoh Output:

2025-02-18 16:30:00
UnitMeaningExample
SECONDSecondsNOW() + INTERVAL 10 SECOND
MINUTEMinutesNOW() + INTERVAL 5 MINUTE
HOURHoursNOW() + INTERVAL 2 HOUR
DAYDaysNOW() + INTERVAL 10 DAY
MONTHMonthsNOW() + INTERVAL 3 MONTH

Hitung Selisih Antara Dua Tanggal dengan DATEDIFF()

SELECT DATEDIFF(NOW(), '2025-01-01');

Contoh Output:

30

Filter Berdasarkan Rentang Tanggal dengan BETWEEN

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';

5. Pengaturan Zona Waktu MySQL

Periksa Zona Waktu Saat Ini

SHOW VARIABLES LIKE '%time_zone%';

Contoh Output:

+------------------+----------------+
| Variable_name    | Value          |
+------------------+----------------+
| system_time_zone | UTC            |
| time_zone        | SYSTEM         |
+------------------+----------------+

Ubah Zona Waktu per Sesi

SET SESSION time_zone = 'Asia/Tokyo';

Ubah Zona Waktu Default Server

Tambahkan berikut ke file konfigurasi (my.cnf):

[mysqld]
default_time_zone = 'Asia/Tokyo'

Dapatkan Waktu UTC dengan UTC_TIMESTAMP

SELECT UTC_TIMESTAMP();

Konversi ke Waktu Lokal dengan CONVERT_TZ()

SELECT CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', 'Asia/Tokyo');

6. Cara Menetapkan Waktu Saat Ini sebagai Nilai Default di MySQL

Tetapkan CURRENT_TIMESTAMP sebagai Nilai Default

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Pembaruan Otomatis dengan ON UPDATE CURRENT_TIMESTAMP

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

Perbedaan Antara DATETIME dan TIMESTAMP

TypeAffected by Time ZoneCan Set CURRENT_TIMESTAMP as Default
TIMESTAMPYesYes
DATETIMENoNo

Mengapa Anda Tidak Dapat Menggunakan NOW() sebagai Nilai Default dan Solusinya

ERROR 1067 (42000): Invalid default value for 'created_at'

Solusi:

CREATE TRIGGER set_created_at
BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();

7. Kesalahan Umum MySQL dan Solusinya (FAQ)

Tidak Dapat Menggunakan NOW() sebagai Nilai Default

Contoh Kesalahan

CREATE TABLE logs (
    created_at DATETIME DEFAULT NOW()
);
ERROR 1067 (42000): Invalid default value for 'created_at'

Solusi

CREATE TABLE logs (
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Waktu CURRENT_TIMESTAMP Tidak Benar

SHOW VARIABLES LIKE 'time_zone';

Solusi

SET SESSION time_zone = 'Asia/Tokyo';

Hasil NOW() Salah Satu Jam

SHOW VARIABLES LIKE 'system_time_zone';

Solusi

SET GLOBAL time_zone = 'Asia/Tokyo';

Penyaringan Rentang BETWEEN Tidak Berfungsi Seperti yang Diharapkan

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01' AND '2025-02-28';

Solusi

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';

8. Praktik Terbaik untuk Menangani Waktu Saat Ini di MySQL

Kapan Menggunakan NOW() vs CURRENT_TIMESTAMP

Use CaseRecommended
Retrieve the current time in a SELECT statementNOW()
Automatically set the current time during INSERTCURRENT_TIMESTAMP
Set as the default value of a TIMESTAMP columnCURRENT_TIMESTAMP

Kapan Menggunakan TIMESTAMP vs DATETIME

Data TypeAffected by Time ZoneStorage Size
TIMESTAMPYes4 bytes
DATETIMENo8 bytes

Simpan dalam UTC dan Konversi ke Waktu Lokal

SELECT CONVERT_TZ(event_time, 'UTC', 'Asia/Tokyo');

Gunakan >= dan < Alih-alih BETWEEN

SELECT * FROM orders
WHERE created_at >= '2025-02-01 00:00:00' 
AND created_at < '2025-03-01 00:00:00';

Standarisasi Penggunaan INTERVAL

SELECT NOW() + INTERVAL 1 DAY;

Bersihkan Data Lama Secara Tepat

DELETE FROM logs WHERE created_at < NOW() - INTERVAL 1 YEAR LIMIT 1000;