Rentang:
Selalu ada kelemahan yang jelas:Rentang yang dapat Anda simpan terbatas dari tahun 1970 hingga 2038. Jika Anda perlu menyimpan tanggal di luar rentang ini, biasanya Anda perlu menggunakan format lain. Kasus paling umum yang saya temukan di mana ini berlaku untuk tanggal lahir.
Keterbacaan:
Saya pikir alasan paling penting mengapa orang memilih untuk menggunakan salah satu tipe tanggal bawaan adalah bahwa data lebih mudah untuk ditafsirkan. Anda dapat melakukan pemilihan sederhana, dan memahami nilainya tanpa harus memformat respons lebih lanjut.
Indeks:
Alasan teknis yang baik untuk menggunakan tipe tanggal adalah memungkinkan kueri yang diindeks dalam beberapa kasus yang tidak dimiliki oleh cap waktu unix. Pertimbangkan pertanyaan berikut:
SELECT * FROM tbl WHERE year(mydate_field) = 2009;
Jika mydate_field adalah tipe tanggal asli, dan ada indeks di lapangan, kueri ini akan benar-benar menggunakan indeks, meskipun ada pemanggilan fungsi. Ini adalah satu-satunya waktu mysql dapat mengoptimalkan panggilan fungsi pada bidang seperti ini. Kueri terkait pada bidang stempel waktu tidak akan dapat menggunakan indeks:
SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009;
Jika Anda memikirkannya sebentar, ada cara untuk mengatasinya. Kueri ini melakukan hal yang sama, dan akan dapat menggunakan pengoptimalan indeks:
SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01");
Perhitungan:
Secara umum, saya menyimpan tanggal sebagai waktu unix, meskipun ada kekurangannya. Ini tidak benar-benar didasarkan pada manfaatnya, melainkan karena saya sudah terbiasa. Saya telah menemukan bahwa ini menyederhanakan beberapa perhitungan, tetapi memperumit yang lain. Misalnya, sangat sulit untuk menambahkan satu bulan ke stempel waktu unix karena jumlah detik per bulan bervariasi. Ini sangat mudah menggunakan fungsi mysql DATE_ADD(). Namun, saya pikir dalam banyak kasus itu sebenarnya menyederhanakan perhitungan. Misalnya, cukup umum bahwa Anda ingin memilih posting dari, katakanlah, dua hari terakhir. Jika bidang berisi stempel waktu unix, ini dapat dilakukan dengan mudah hanya dengan melakukan:
SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;
Ini mungkin masalah selera, tetapi saya pribadi merasa ini lebih cepat dan lebih mudah daripada harus mengingat sintaks fungsi seperti DATE_SUB().
Zona waktu:
Stempel waktu Unix tidak dapat menyimpan data zona waktu. Saya tinggal di swedia yang memiliki satu zona waktu, jadi ini bukan masalah bagi saya. Namun, ini bisa menjadi masalah besar jika Anda tinggal di negara yang memiliki banyak zona waktu.