Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah MySQL mendukung tanggal historis (seperti 1200)?

Untuk contoh spesifik yang Anda gunakan pada pertanyaan Anda (tahun 1200), secara teknis semuanya akan berhasil.

Namun, secara umum, stempel waktu tidak disarankan untuk penggunaan ini. Pertama, batasan jangkauan bersifat arbitrer:di MySQL tanggal 1 Januari 1000. Jika Anda bekerja dengan hal-hal abad ke-12-13, semuanya berjalan baik-baik saja... tetapi jika pada suatu saat Anda perlu menambahkan sesuatu yang lebih lama (abad ke-10 atau lebih awal), tanggalnya akan rusak parah, dan untuk memperbaiki masalah ini, Anda perlu memformat ulang semua tanggal bersejarah Anda menjadi sesuatu yang lebih memadai.

Stempel waktu biasanya direpresentasikan sebagai bilangan bulat mentah, dengan "interval centang" dan "titik epoch" yang diberikan, jadi jumlahnya memang jumlah tick yang berlalu sejak epoch hingga tanggal yang diwakili (atau sebaliknya untuk tanggal negatif). Ini berarti bahwa, seperti halnya tipe data integer tetap-dengan, himpunan nilai yang dapat direpresentasikan adalah terbatas. Sebagian besar format stempel waktu yang saya ketahui tentang rentang pengorbanan demi presisi, sebagian besar karena aplikasi yang perlu melakukan aritmatika waktu sering kali harus melakukannya dengan presisi yang layak; sedangkan aplikasi yang perlu bekerja dengan tanggal historis sangat jarang perlu melakukan aritmatika yang serius.

Dengan kata lain, cap waktu dimaksudkan untuk tepat representasi tanggal. Ketepatan kedua (atau bahkan sepersekian detik) tidak masuk akal untuk tanggal sejarah:dapatkah Anda memberi tahu saya, hingga milidetik, kapan Henry yang ke-8 dinobatkan sebagai Raja Inggris?

Dalam kasus MySQL, formatnya secara inheren didefinisikan sebagai "4 digit tahun", sehingga setiap pengoptimalan terkait dapat mengandalkan asumsi bahwa tahun tersebut akan memiliki 4 digit, atau bahwa seluruh string akan memiliki tepat 10 karakter ("yyyy- mm-dd"), dll. Hanya masalah keberuntungan bahwa tanggal yang Anda sebutkan di judul Anda masih cocok, tetapi bahkan mengandalkan itu masih berbahaya:selain apa yang dapat disimpan oleh DB itu sendiri, Anda perlu mengetahui apa yang sisa tumpukan server Anda dapat dimanipulasi. Misalnya, jika Anda menggunakan PHP untuk berinteraksi dengan database Anda, mencoba menangani tanggal historis kemungkinan besar akan macet di beberapa titik atau lainnya (pada lingkungan 32-bit, rentang stempel waktu gaya UNIX adalah 13 Desember 1901 hingga 19 Januari 2038).

Singkatnya:MySQL akan menyimpan dengan benar tanggal apa pun dengan tahun 4 digit; tetapi secara umum menggunakan stempel waktu untuk tanggal historis hampir dijamin akan memicu masalah dan sakit kepala lebih sering daripada tidak. Saya sangat menyarankan penggunaan seperti itu.

Semoga membantu.

Sunting/tambahan:

Saya tidak berpikir DB mana pun memiliki terlalu banyak dukungan untuk tanggal semacam ini:aplikasi yang paling sering menggunakannya sudah cukup dengan representasi string-/text-. Sebenarnya, untuk tanggal pada tahun 1 dan selanjutnya, representasi tekstual bahkan akan menghasilkan penyortiran/perbandingan yang benar (asalkan tanggal diwakili oleh urutan besarnya:urutan y,m,d). Akan tetapi, perbandingan akan terputus jika tanggal "negatif" juga disertakan (tanggal tersebut masih akan dibandingkan lebih awal dari tanggal positif mana pun, tetapi membandingkan dua tanggal negatif akan menghasilkan hasil yang terbalik).

Jika Anda hanya membutuhkan tanggal Tahun 1 dan yang lebih baru, atau jika Anda tidak perlu menyortir, maka Anda dapat membuat hidup Anda jauh lebih mudah dengan menggunakan string.

Jika tidak, pendekatan terbaik adalah menggunakan beberapa jenis angka, dan tentukan "interval centang" dan "titik zaman" Anda sendiri. Interval yang baik bisa berhari-hari (kecuali jika Anda benar-benar membutuhkan presisi lebih lanjut, tetapi meskipun demikian Anda dapat mengandalkan angka "nyata" (titik-mengambang) alih-alih bilangan bulat); dan zaman yang masuk akal bisa 1 Januari 1. Masalah utamanya adalah mengubah nilai-nilai ini ke representasi teksnya, dan sebaliknya. Anda perlu mengingat detail berikut:

  • Tahun kabisat memiliki satu hari ekstra.
  • Aturan untuk tahun kabisat adalah "setiap kelipatan 4" sampai tahun 1582, ketika diubah dari kalender Julian ke Gregorian dan menjadi "kelipatan 4 kecuali yang merupakan kelipatan 100 kecuali jika juga kelipatan 400".
  • Hari terakhir kalender Julian adalah 4 Oktober 1582. Hari berikutnya, pertama dalam kalender Gregorian, adalah 15 Oktober 1582. 10 hari dilewati untuk membuat kalender baru cocok lagi dengan musim.
  • Seperti yang dinyatakan dalam komentar, dua aturan di atas berbeda di setiap negara:negara-negara Kepausan dan beberapa negara Katolik mengadopsi kalender baru pada tanggal yang ditentukan, tetapi banyak negara lain membutuhkan waktu lebih lama untuk melakukannya (terakhir adalah Turki pada tahun 1926) . Ini berarti bahwa setiap tanggal antara banteng kepausan pada tahun 1582 dan adopsi terakhir pada tahun 1926 akan menjadi ambigu tanpa konteks geografis, dan bahkan lebih rumit untuk diproses.
  • Tidak ada "tahun 0":tahun sebelum tahun 1 adalah tahun -1, atau tahun 1 SM.

Semua ini membutuhkan fungsi parser dan formater yang cukup rumit, tetapi di luar banyak pemecahan kasus per kasus, sebenarnya tidak ada terlalu banyak kerumitan (akan membosankan untuk kode, tetapi cukup mudah). Penggunaan angka sebagai representasi yang mendasari memastikan penyortiran/pembandingan yang benar untuk setiap pasangan nilai.

Mengetahui hal ini, sekarang adalah pilihan Anda untuk mengambil pendekatan yang lebih sesuai dengan kebutuhan Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Strategi Pencadangan dan Pemulihan MySQL/MariaDB yang Berhasil

  2. Apa yang dimaksud dan dilakukan MYSQLI_NUM?

  3. Tanggal putaran MySQL hingga awal minggu dan bulan

  4. mysql like% query lambat dengan indeks teks lengkap

  5. Mendukung transaksi, penguncian tingkat baris, dan kunci asing