Bagian ini menjelaskan tentang fungsi yang dapat digunakan untuk memanipulasi nilai-nilai temporal. Setiap tipe temporal memiliki rentang nilai yang valid, begitu juga "nol" yang bisa digunakan ketika Anda ingin menentukan nilai tidak valid yang mana tidak bisa diwakilkan oleh MySQL.

Fungsi Tanggal dan Waktu MySQL
1. NOW(fsp) dan SYSDATE(fsp)
Fungsi ini akan mengembalikan nilai berupa tanggal dan waktu saat ini, dalam format 'YYYY-MM-DD HH:MM:SS' atau YYYYMMDDHHMMSS, tergantung pada konteks apakah fungsi tersebut digunakan, apakah dalam string atau numerik. Nilai tersebut dinyatakan dalam zona waktu saat ini (sedang berlangsung).
Argumen fsp (fractional seconds precision) digunakan untuk menentukan tingkat presisi nilai detik, sehingga menjadi bentuk pecahan. Tingkat presisi hanya dibatasi dari 0 sampai 6 dibelakang koma.
Contoh:
SELECT NOW();
Output:

Saat dimana fungsi NOW() dieksekusi

Saat dimana fungsi NOW() disertai argumen dieksekusi
SELECT NOW(4),
SYSDATE(3);
Output:

Saat dimana fungsi NOW() dan SYSDATE() disertai argumen dieksekusi
2. MONTH(date) dan MONTHNAME(date)
Fungsi ini akan mengembalikan nilai berupa bulan berdasarkan argumen yang disertakan. Jika MONTH(date), maka nilai tersebut akan diekspresikan berupa angka mulai dari 1 sampai 12. Jika MONTHNAME(date), maka nilai tersebut akan diekspresikan berupa text sesuai dengan nama bulannya.
Contoh:
SELECT MONTH('2017-02-21'),
MONTHNAME('2017-02-21');
Output:

MONTH(date) dan MONTHNAME(date)
3. DAY(date) atau DAYOFMONTH(date) dan DAYNAME(date)
DAY() adalah sinonim dari DAYOFMONTH(), yaitu fungsi yang akan mengembalikan nilai berupa hari dalam rentang 1 sampai 31, atau akan mengembalikan nilai 0 jika argumen tanggalnya seperti ini '0000-00-00' atau '2008-00-00'. Sedangkan DAYNAME(date) akan mengembalikan nilai berupa text sesuai nama harinya.
Contoh:
SELECT
DAY('2017-02-21'),
DAYOFMONTH('2017-02-21'),
DAYNAME('2017-02-21');
Output:

DAY(date) atau DAYOFMONTH(date) dan DAYNAME(date)
4. WEEK(date, mode)
Fungsi ini akan mengembalikan jumlah/urutan minggu dimulai sejak tahun baru sampai tanggal argumen. Ada dua jenis bentuk argumen WEEK() yang memungkinkan Anda untuk menentukan apakah seminggu tersebut dimulai pada hari minggu atau hari senin, dan apakah nilai yang dikembalikan harus berkisar 0 sampai 53 atau 1 sampai 53. Jika mode argumen dihilangkan, maka format default week akan otomatis digunakan.
| ommand-Line Format | --default_week_format=# | |
|--------------------|-------------------------|---------------------|
| System Variable | Name | default_week_format |
| | Variable Scope | Global, Session |
| | Dynamic Variable | Yes |
| Permitted Values | Type | integer |
| | Default | 0 |
| | Min Value | 0 |
| | Max Value | 7 |
Tabel di bawah ini menjelaskan tentang bagaimana mode argumen bekerja;
| Mode | First day of week | Range | Week 1 is the first week … |
|------|-------------------|-------|-------------------------------|
| 0 | Sunday | 0-53 | with a Sunday in this year |
| 1 | Monday | 0-53 | with 4 or more days this year |
| 2 | Sunday | 1-53 | with a Sunday in this year |
| 3 | Monday | 1-53 | with 4 or more days this year |
| 4 | Sunday | 0-53 | with 4 or more days this year |
| 5 | Monday | 0-53 | with a Monday in this year |
| 6 | Sunday | 1-53 | with 4 or more days this year |
| 7 | Monday | 1-53 | with a Monday in this year |
Untuk nilai mode dengan maksud "4 hari atau lebih pada tahun ini", atau dengan kata lain "perdebatan tentang jumlah hari dalam seminggu yang berada di antara desember-januari" telah diatur sesuai ISO 8601: 1988:
- Jika seminggu yang mengandung 1 Januari memiliki 4 atau lebih hari di tahun baru, maka itu adalah minggu ke-1.
- Jika tidak, maka itu adalah minggu terakhir dari tahun sebelumnya, dan minggu depannya adalah minggu ke-1.
Sementara itu Achmad Solichin menjelaskan bahwa, fungsi ini digunakan untuk mendapatkan urutan minggu (integer) dari suatu tanggal yang diberikan dalam setahun.
Contoh:
SELECT WEEK('2008-02-20'),
WEEK('2008-02-20',0),
WEEK('2008-02-20',1),
WEEK('2008-12-31',1);
Output:

Fungsi WEEK()
SELECT WEEK(NOW()),
WEEK(NOW(),0),
WEEK(NOW(),1),
WEEK('2008-12-31',2);
Output:

Fungsi NOW() dalam WEEK()
5. WEEKDAY(date)
Mengembalikan nilai berupa index hari kerja untuk tanggal argumen, dimana 0 = Senin, 1 = Selasa, ...s/d. 6 = Minggu.
Contoh:
SELECT WEEKDAY(NOW()),
WEEKDAY('2017-2-22');
Output:

WEEKDAY(date)
6. WEEKOFYEAR(date)
Fungsi ini akan mengembalikan urutan minggu pada tanggal argumen, dengan rentang 1 sampai 53. WEEKOFYEAR() adalah fungsi yang ekuivalen(setara) dengan WEEK(date,3).
Contoh:
SELECT WEEKOFYEAR(NOW());
Output:

WEEKOFYEAR(date)
Jadi memang benar saat ini NOW(), sudah masuk pada minggu ke-8. Berikut adalah detail ulasannya:

Penghitungan urutan minggu secara manual untuk saat ini NOW() bertepatan tanggal 22-Feb-2017
7. YEAR(date)
Fungsi ini akan mengembalikan nilai tahun pada tanggal argumen, berkisar antara 1000-9999, atau 0 jika itu diisi dengan nol.
Contoh:
SELECT YEAR('1987-01-01'),
YEAR(NOW());
Output:

YEAR(date)
8. HOUR(time)
Fungsi ini akan mengembalikan nilai waktu berupa jam. Rentang nilai yang dikembalikan berkisar 0 sampai 23 time-of-day (jumlah jam dalam sehari). Namun, rentang waktu sebenarnya jauh lebih besar dari itu (tidak dibatasi oleh hari), sehingga nilai jam dapat dikembalikan lebih besar dari 23.
Sementara itu Achmad Solichin menjelaskan bahwa, fungsi ini digunakan untuk mendapatkan bilangan jam dari suatu parameter waktu yang diberikan.
Contoh:
SELECT HOUR(NOW()),
-- Fungsi NOW() saya running saat pukul 11.19 PM
HOUR('23:59:03'),
HOUR('272:59:59');
Output:

HOUR(time)
9. MINUTE(time)
Fungsi ini akan mengembalikan nilai waktu berupa menit, dalam rentang 0 sampai 59.
Sementara itu Achmad Solichin menjelaskan bahwa, fungsi ini digunakan untuk mendapatkan bilangan menit dari suatu parameter waktu yang diberikan.
Contoh:
SELECT MINUTE('2008-02-03 10:05:03'),
MINUTE(NOW());
-- Fungsi NOW() saya running saat waktu
-- menunjukan pukul 11.25 PM.
Output:

MINUTE(time)
10. SECOND(time)
Fungsi ini akan mengembalikan nilai berupa detik, berkisar antara 0 sampai 59.
Sementara itu Achmad Solichin menjelaskan bahwa, fungsi ini digunakan untuk mendapatkan bilangan detik dari suatu waktu yang diberikan.
Contoh:
SELECT SECOND('10:05:03'),
SECOND(NOW());
-- Fungsi NOW() saya running saat waktu
-- menunjukan pukul 11.33.? PM.
Output:

SECOND(time)
11. DATE_ADD(date,INTERVAL expr unit) dan DATE_SUB(date,INTERVAL expr unit)
Dua fungsi tersebut akan melakukan operasi aritmatik (penambahan / pengurangan) tanggal. Argumen date menentukan tanggal dimulai atau nilai datetime. Argumen expr adalah ekspresi untuk menentukan interval nilai yang akan ditambahkan atau dikurangi dari tanggal dimulai. Argumen expr adalah string; bisa dimulai dengan "-" untuk interval negatif. Argumen unit adalah keyword yang menunjukan ekspresi mana yang harus di interpreted(ditafsirkan).
Keyword INTERVAL dan specifier unit (unit penunjuk) tidak bersifat case sensitive.
Tabel berikut menunjukan bagaimana format yang diharapkan oleh argumen expr untuk setiap nilai unit.
| Unit Value | Expected expr Format |
|--------------------|-------------------------------------------|
| MICROSECOND | MICROSECONDS |
| SECOND | SECONDS |
| MINUTE | MINUTES |
| HOUR | HOURS |
| DAY | DAYS |
| WEEK | WEEKS |
| MONTH | MONTHS |
| QUARTER | QUARTERS |
| YEAR | YEARS |
| SECOND_MICROSECOND | 'SECONDS.MICROSECONDS' |
| MINUTE_MICROSECOND | 'MINUTES:SECONDS.MICROSECONDS' |
| MINUTE_SECOND | 'MINUTES:SECONDS' |
| HOUR_MICROSECOND | 'HOURS:MINUTES:SECONDS.MICROSECONDS' |
| HOUR_SECOND | 'HOURS:MINUTES:SECONDS' |
| HOUR_MINUTE | 'HOURS:MINUTES' |
| DAY_MICROSECOND | 'DAYS HOURS:MINUTES:SECONDS.MICROSECONDS' |
| DAY_SECOND | 'DAYS HOURS:MINUTES:SECONDS' |
| DAY_MINUTE | 'DAYS HOURS:MINUTES' |
| DAY_HOUR | 'DAYS HOURS' |
| YEAR_MONTH | 'YEARS-MONTHS' |
Jika Anda menambahkan atau mengurangi nilai tanggal yang berisi paruh waktu, maka hasilnya otomatis akan dikonversi ke nilai datetime.
Contoh:
SELECT DATE_ADD('2013-01-02', INTERVAL 1 DAY),
DATE_ADD('2013-01-02', INTERVAL 1 HOUR);
Output:

DATE_ADD(date,INTERVAL expr unit)
SELECT DATE_SUB('2013-01-02', INTERVAL 1 DAY),
DATE_SUB('2013-01-02', INTERVAL 1 HOUR);
Output:

DATE_SUB(date,INTERVAL expr unit)
Jika Anda menambahkan MONTH, YEAR_MONTH, atau YEAR dan tanggal yang dihasilkan memiliki jumlah hari maksimum untuk bulan baru, maka hari akan diatur ke maksimum di bulan baru.
Contoh:
SELECT DATE_ADD('2009-01-30', INTERVAL 1 MONTH);
Output:

DATE_ADD(date,INTERVAL expr unit)
12. ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days) dan SUBDATE(date,INTERVAL expr unit), SUBDATE(expr,days)
Ketika fungsi ini dipanggil dengan bentuk INTERVAL dari argumen kedua, ADDDATE() adalah sinonim untuk DATE_ADD(). Sedangkan SUBDATE() adalah sinonim dari DATE_SUB().
Contoh:
SELECT DATE_ADD('2008-01-02', INTERVAL 31 DAY),
ADDDATE('2008-01-02', INTERVAL 31 DAY);
Output:

ADDDATE(date,INTERVAL expr unit)
Ketika fungsi ADDDATE() dipanggil menggunakan bentuk argumen keduanya format hari, maka MySQL memperlakukan sebagai integer jumlah hari yang akan ditambahkan ke expr.
SELECT ADDDATE('2008-01-02', 31);
Output:

ADDDATE(expr,days)
SELECT DATE_SUB('2008-01-02', INTERVAL 31 DAY),
SUBDATE('2008-01-02', INTERVAL 31 DAY);
Output:

SUBDATE(date,INTERVAL expr unit)
Ketika fungsi SUBDATE() dipanggil menggunakan bentuk argumen keduanya format hari, maka MySQL memperlakukan sebagai integer jumlah hari yang akan ditambahkan ke expr.
SELECT SUBDATE('2008-01-02 12:00:00', 31);
Output:

SUBDATE(expr,days)
13. DATE_FORMAT(date,format)
Fungsi ini digunakan untuk memformat nilai tanggal sesuai dengan format string.
Specifier berkut dapat digunakan dalam format string. Karakter ini % diperlukan sebelum format karakter specifier.
Sementara itu Achmad Solichin menjelaskan bahwa, fungsi ini digunakan untuk mem-format tampilan tanggal.
| Specifier | Description |
|-----------|----------------------------------------------------------------------------------------------------|
| %a | Nama hari disingkat (Sun..Sat) |
| %b | Nama bulan disingkat (Jan..Dec) |
| %c | Bulan, numerik (0..12) |
| %D | Hari dalam sebulan dengan suffix bahasa Inggris (0th, 1st, 2nd, 3rd, …) |
| %d | Hari dalam sebulan, numerik (00..31) |
| %e | Hari dalam sebulan, numerik (0..31) |
| %f | Mikrodetik (000000..999999) |
| %H | Jam (00..23) |
| %h | Jam (01..12) |
| %I | Jam (01..12) |
| %i | Menit, numerik (00..59) |
| %j | Hari dalam setahun (001..366) |
| %k | Jam (0..23) |
| %l | Jam (1..12) |
| %M | Nama bulan (January..December) |
| %m | Bulan, numerik (00..12) |
| %p | AM atau PM |
| %r | Waktu, 12-jam (hh:mm:ss followed by AM or PM) |
| %S | Detik (00..59) |
| %s | Detik (00..59) |
| %T | Waktu, 14-jam (hh:mm:ss) |
| %U | Seminggu (00..53), dimana hari Minggu sebagai hari pertamanya; WEEK() mode 0 |
| %u | Seminggu (00..53), dimana hari Senin sebagai hari pertamanya; WEEK() mode 1 |
| %V | Seminggu (01..53), dimana hari Minggu sebagai hari pertamanya; WEEK() mode 2, digunakan dengan %X |
| %v | Seminggu (01..53), dimana hari Senin sebagai hari pertamanya; WEEK() mode 3, digunakan dengan %X |
| %W | Nama hari dalam seminggu (Sunday..Saturday) |
| %w | Hari dalam seminggu (0=Sunday..6=Saturday) |
| %X | Tahun untuk mingguan, dimana Minggu sebagai hari pertamanya, numerik, 4 digit, digunakan dengan %V |
| %x | Tahun untuk mingguan, dimana Senin sebagai hari pertamanya, numerik, 4 digit, digunakan dengan %V |
| %Y | Tahun, numerik, 4 digit |
| %y | Tahun, numerik, 2 digit |
| %% | Literal karakter % |
| %x | X, untuk setiap "X" yang tidak tercantum dalam daftar diatas. |
Rentang untuk specifier bulan dan hari dimulai dengan nol karena fakta bahwa MySQL mengijinkan penyimpanan tanggal secara tidak lengkap seperti '2014-00-00'.
Bahasa yang digunakan untuk penamaan hari dan bulan disingkat, ini dikendalikan oleh nilai variabel sistem Ic_time_names.
Untuk specifier %U, %u, %V, dan %v, Anda bisa melihatnya pada penjelasan tentang fungsi WEEK(). Penggunaan mode akan mempengaruhi penomeran mingguan.
DATE_FORMAT() mengembalikan sebuah string dengan set karakter dan pemeriksaan yang dilakukan oleh character_set_connection dan collation_connection, sehingga dapat mengembalikan nama bulan dan hari yang berisi karakter non-ASCII.
Contoh:
SELECT DATE_FORMAT (now(), '%d-%M-%Y %H:%i:%s') AS Contoh1,
DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y') AS Contoh2,
DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s') AS Contoh3,
DATE_FORMAT('1900-10-04 22:23:00', '%D %y %a %d %m %b %j') AS Contoh4,
DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w') AS Contoh5,
DATE_FORMAT('1999-01-01', '%X %V') AS Contoh6,
DATE_FORMAT('2006-06-00', '%d') AS Contoh7;
Output:

DATE_FORMAT(date,format)
Referensi: