Saya membuat database untuk catatan yang melampaui sebelum 1000 AD, tetapi bidang MySQL Date dan DateTime hanya mendukung tanggal mulai 1000.
Apakah ada cara yang lebih nyaman daripada menggunakan tipe bigint untuk menghitung detik sebelum / sesudah 1/1/1970 menggunakan cap waktu Unix, atau beralih ke perangkat lunak database yang mendukung rentang tanggal yang lebih besar?
mysql
database-design
best-practices
timestamp
date-format
David LeBauer
sumber
sumber
Jawaban:
Alternatifnya adalah menyimpan setiap bagian dari tanggal dalam bidang angka. Jadi, Anda akan memiliki tiga bidang:
Dengan cara ini masih bisa dibaca manusia. Kisaran nilai untuk berbagai tipe data numerik di MySQL tersedia di Ikhtisar Jenis Numerik . Persyaratan penyimpanan tersedia di Persyaratan Penyimpanan Tipe Data .
sumber
Tidak ada tipe data tanggal RDBMS asli yang akan dilakukan untuk aplikasi yang memerlukan tanggal yang sangat lama (dan untuk beberapa, bahkan di masa mendatang).
Jika saya jadi Anda, saya akan menggunakan tipe string untuk penyimpanan asli dan tetap dengan format tempat-signifikan seperti: + YYYY-MM-DD untuk mengakomodasi BC / AD dan tanggal mendatang yang masuk akal secara historis atau masuk akal.
Jika mungkin membantu, Anda bisa membangun kelas perpustakaan yang mengubah format penyimpanan internal Anda menjadi yang lebih rapi untuk lapisan UI. Anda bahkan mungkin menyertakan fungsi pustaka yang mengonversi ke tipe tanggal asli, jika bahasa pilihan Anda mendukung tanggal yang akan Anda miliki di database Anda.
sumber
CHECK
batasan untuk menerapkan format string tanggal. Sayangnya, MySQL tidak menegakkanCHECK
batasan.BIT
atauBOOLEAN
untuk menunjukkan polaritas tanggal. :) Tentu saja, jika Anda melakukan itu, Anda sendirian jika melakukan perhitungan pada tanggal "BC" itu. Siapa yang tahu penyesuaian kalender seperti apa yang biasanya dijaga untuk kita oleh fungsi perpustakaan akan terlewatkan saat memanipulasi tanggal BC "palsu" ...Bagaimana kalau memiliki bidang float tunggal dalam tabel di mana kami menyimpan tanggal dalam format numerik untuk misalnya 2015-10-12 10:12:05 akan disimpan 20151012. 101205. Selalu lebih baik untuk memiliki pengurutan pada bidang tunggal daripada memiliki 3 atau lebih bidang yang berbeda.
Logika di atas tidak berfungsi untuk beberapa skenario. Jadi, kami telah mengonversi tanggal menjadi Detik mengingat 1 hari = 86400 detik. Digunakan negatif untuk tanggal SM. Ini berfungsi seperti yang diharapkan.
sumber