Di Ruby on Rails, apa perbedaan antara DateTime, Timestamp, Waktu dan Tanggal?

414

Dalam pengalaman saya, mendapatkan tanggal / waktu yang tepat ketika pemrograman selalu penuh dengan bahaya dan kesulitan.

Ruby dan Rails selalu menghindari saya tentang hal ini, jika hanya karena banyaknya pilihan; Saya tidak pernah tahu mana yang harus saya pilih.

Ketika saya menggunakan Rails dan melihat tipe data ActiveRecord saya bisa menemukan yang berikut ini

: datetime,: timestamp,: time, dan: date

dan tidak tahu apa perbedaannya atau di mana gotchas mengintai.

Apa bedanya? Untuk apa Anda menggunakannya?

(PS Saya menggunakan Rails3)

Nick May
sumber

Jawaban:

572

Perbedaan antara format tanggal / waktu yang berbeda dalam ActiveRecord tidak ada hubungannya dengan Rails dan semuanya terkait dengan database apa pun yang Anda gunakan.

Menggunakan MySQL sebagai contoh (jika tidak ada alasan lain karena itu yang paling populer), Anda memiliki DATE, DATETIME, TIMEdan TIMESTAMPjenis data kolom; seperti Anda memiliki CHAR, VARCHAR, FLOATdan INTEGER.

Jadi, Anda bertanya, apa bedanya? Yah, beberapa dari mereka cukup jelas. DATEhanya menyimpan tanggal, TIMEhanya menyimpan waktu, sementara DATETIMEmenyimpan keduanya.

Perbedaan antara DATETIMEdan TIMESTAMPsedikit lebih halus: DATETIMEdiformat sebagai YYYY-MM-DD HH:MM:SS. Rentang yang valid berkisar dari tahun 1000 hingga tahun 9999 (dan semuanya berada di antaranya. Meskipun TIMESTAMP terlihat serupa ketika Anda mengambilnya dari basis data, ini benar-benar hanya sebuah front untuk cap waktu unix . Rentang validnya berkisar antara 1970 hingga 2038. Perbedaannya di sini, selain dari berbagai fungsi built-in dalam mesin database, adalah ruang penyimpanan. Karena DATETIMEmenyimpan setiap digit dalam tahun, bulan, jam, menit, dan kedua, ia menghabiskan total 8 byte. Karena TIMESTAMPhanya menyimpan nomor detik sejak 1970-01-01, ia menggunakan 4 byte.

Anda dapat membaca lebih lanjut tentang perbedaan antara format waktu di MySQL di sini .

Pada akhirnya, itu tergantung pada apa yang Anda perlu kolom tanggal / waktu Anda lakukan. Apakah Anda perlu menyimpan tanggal dan waktu sebelum tahun 1970 atau setelah 2038? Gunakan DATETIME. Apakah Anda perlu khawatir tentang ukuran basis data dan Anda berada dalam rentang waktu itu? Gunakan TIMESTAMP. Apakah Anda hanya perlu menyimpan tanggal? Gunakan DATE. Apakah Anda hanya perlu menyimpan waktu? Gunakan TIME.

Setelah mengatakan semua ini, Rails sebenarnya membuat beberapa keputusan untuk Anda . Keduanya :timestampdan :datetimeakan default ke DATETIME, sementara :datedan :timesesuai dengan DATEdan TIME, masing-masing.

Ini berarti bahwa di dalam Rails, Anda hanya perlu memutuskan apakah Anda perlu menyimpan tanggal, waktu atau keduanya.

vonconrad
sumber
7
Sebagai catatan, saya lebih suka cap waktu absolut (unix) karena format YYYY-MM-DD tergantung pada zona waktu yang digunakan. Jadi klien perlu mengetahui zona waktu server, dan perlu melakukan konversi. Stempel waktu absolut-sejak-1970 tidak memiliki masalah itu.
n13
32
@ n13 Poin bagus, tetapi sebenarnya bukan masalah di Rails, karena dikonversi ke UTC sebelum memasukkan datetimes ke dalam database.
vonconrad
13
Ini adalah salah satu posting paling membantu di dunia Rails. Ini harus ditambahkan ke panduan rel ...
Andrew
4
TIMEKolom MySQL bukan sepenuhnya "waktu", karena menerima jam> 24; ini juga dapat digunakan sebagai "waktu berlalu".
jamaah
6
Apakah ini sama dengan dbs lain? mis. postgres?
Andy Hayden
24
  1. : datetime (8 bytes)

    • Tanggal dan Waktu Toko diformat YYYY-MM-DD HH: MM: SS
    • Berguna untuk kolom seperti birth_date
  2. : cap waktu (4 byte)

    • Menyimpan jumlah detik sejak 1970-01-01
    • Berguna untuk kolom seperti updated_at, Created_at
  3. : date (3 bytes)
    • Tanggal Toko
  4. : waktu (3 byte)
    • Menyimpan waktu
mingca
sumber
3
Ini lebih seperti versi TL: DR dari jawaban yang diterima di atas
Chidozie Nnachor
0

Inilah penjelasan yang luar biasa dan tepat yang saya temukan.

TIMESTAMP digunakan untuk melacak perubahan catatan, dan memperbarui setiap kali ketika catatan diubah. DATETIME digunakan untuk menyimpan nilai spesifik dan statis yang tidak terpengaruh oleh perubahan apa pun dalam catatan.

TIMESTAMP juga dipengaruhi oleh pengaturan TIME ZONE yang berbeda. DATETIME adalah konstan.

TIMESTAMP secara internal mengonversi zona waktu saat ini menjadi UTC untuk penyimpanan, dan selama pengambilan mengonversi kembali ke zona waktu saat ini. DATETIME tidak dapat melakukan ini.

TIMESTAMP adalah 4 byte dan DATETIME adalah 8 byte.

Kisaran yang didukung TIMESTAMP: '1970-01-01 00:00:01 ′ UTC hingga' 2038-01-19 03:14:07 ′ Kisaran DATETIME UTC yang didukung: '1000-01-01 00:00:00 ′ hingga' 9999 -12-31 23:59:59 ′

sumber: https://www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/#:~:text=DATETIME%20vs%20TIMESTAMP%3A ,DATETIME % 20adalah2020 .

Juga...

tabel dengan tipe "tanggal" kolom yang berbeda dan tipe migrasi rel yang sesuai tergantung pada database

Stanislav Modrák
sumber