Datetime vs Timestamp di MySQL dan PHP dalam praktiknya?

24

Saya tidak yakin bagaimana menentukan datatype saya sebagai datetime atau cap waktu, saya pikir saya akan membutuhkan keduanya tetapi pada acara yang berbeda. Situs web saya menjual produk dan layanan di seluruh dunia dan juga memiliki sistem akun agar pengguna dapat masuk. Harap klarifikasi berikut ini:

  • Pelanggan tanggal dan waktu saat ini membeli produk dari situs web saya: Datetime?
  • Tanggal dan waktu pengiriman berdasarkan lokasi dan tanggal / waktu yang dibeli, dihitung dari sistem kami: Datetime?
  • Terakhir kali mereka masuk di akun mereka: Timestamp?

    1. Apa kode di php untuk menyimpan tanggal pembelian (tanggal saat ini) dan kemudian menyimpan dalam database?
    2. Tolong jelaskan bagaimana cara menggunakan masing-masing karena setelah membaca banyak penjelasan di internet, saya masih belum mengerti.
Modular
sumber
Beberapa waktu yang lalu saya memiliki proyek besar di mana kinerja adalah mutlak harus, setelah berbulan-bulan penelitian kami akhirnya pergi dengan timestamp UTC disimpan di bidang varchar, terbukti lebih cepat dan lebih baik untuk kebutuhan kita (jaringan sosial besar)
JasonDavis

Jawaban:

29

Stempel waktu MySQL :

  • Disimpan dalam UTC

    Mereka dikonversi ke UTC pada penyimpanan dan dikonversi kembali ke zona waktu Anda saat pengambilan. Jika Anda mengubah pengaturan zona waktu , nilai yang diambil juga berubah.

  • Dapat diinisialisasi dan diperbarui secara otomatis

    Anda dapat mengatur nilai default dan / atau nilai pembaruan otomatis CURRENT_TIMESTAMP

  • Memiliki rentang 1970-01-01 00:00:01 UTChingga2038-01-19 03:14:07 UTC

Sedangkan datetime MySQL :

  • Apa yang Anda simpan adalah apa yang Anda dapatkan ™.

  • Memiliki rentang 1000-01-01 00:00:00hingga9999-12-31 23:59:59

    Nilai di luar rentang mungkin berfungsi - tetapi hanya nilai dalam rentang yang dijamin akan berfungsi.

  • Anda dapat menyimpan tanggal di mana hari atau bulan nol.

    Ini adalah cara MySQL menyimpan ulang tahun! Anda tidak dapat melakukannya dengan TIMESTAMP, dengan satu-satunya pengecualian adalah nilai nol 0000-00-00.

  • Anda dapat menyimpan tanggal yang tidak valid, jika Anda membutuhkannya, dalam mode ALLOW_INVALID_DATES .

  • Anda dapat menetapkan nilai default NOW()dalam beberapa kasus, tetapi cara yang lebih disukai dan lebih alami dari tanggal yang diinisialisasi dan diperbarui secara otomatis adalah TIMESTAMP.

Dan tentu saja ada juga DATEdan TIME, yang berfungsi seperti itu DATETIME, tetapi tentu saja DATEtidak peduli waktu dan TIMEtidak peduli dengan kencan. Keempat tipe data bekerja dengan sempurna dengan beragam fungsi tanggal dan waktu , tetapi ketika Anda mencampur tipe data Anda harus menyadari efek konversi .

Sekarang, untuk pertanyaan Anda: Anda harus menggunakannya di DATETIMEmana-mana. Bukan karena alasan teknis, tetapi karena Anda masih tidak jelas tentang cara kerja MySQL, DATETIMEadalah pilihan yang lebih sederhana. Ini berarti Anda harus menghitung cap waktu saat ini di PHP sebelum menyimpan, semudah:

$mysqldate = date("Y-m-d H:i:s"); 

Fungsi tanggal PHP berfungsi seperti:

string date ( string $format [, int $timestamp = time() ] )

The "Y-m-d H:i:s"Format adalah salah satu yang kompatibel dengan MySQL dan dengan meninggalkan parameter kedua kosong, date()panggilan time()untuk mendapatkan arus UNIX timestamp .

Menggunakan TIMESTAMPbukan DATETIMEmemiliki nilai tambah MySQL mengambil alih tanggung jawab memutuskan cap waktu saat ini, dan Anda dapat melewati bidang ketika Anda memasukkan / memperbarui. Tetapi karena Anda sudah mengirim kueri, dan kode untuk mendapatkan cap waktu saat ini di PHP minimal, Anda dapat menggunakan DATETIMEsemuanya dengan aman .

Adapun kode aktual untuk menyimpan stempel waktu PHP ke dalam basis data, Anda harus melihat pada PHP Data Objects , dan jika Anda masih belum jelas, tanyakan pada StackOverflow sebagai gantinya. Tetapi sudah ada hampir 1.5k pertanyaan terkait , pastikan Anda menjalaninya sebelum bertanya. Sekedar petunjuk, pernyataan yang disiapkan adalah bagaimana anak-anak keren melakukannya.

yannis
sumber
Hmm, itu bisa menjadi masalah pada bagaimana Anda mengirim kueri ke MySQL, atau dalam struktur tabel Anda ... StackOverflow adalah tempat yang lebih baik untuk masalah seperti ini, kirimkan pertanyaan di sana dengan struktur tabel dan kode php lengkap Anda, dan beberapa perincian tentang apa masalahnya dan apa yang sudah Anda coba. Kami tidak benar-benar membahas spesifikasi implementasi di sini ...
yannis
Terima kasih untuk balasan Anda. Saya telah mencoba menggunakan $ mysqldate = date ("Ymd H: i: s"); $ query = INSERT INTO table VALUE ('". $ mysqldate."') pada kode php saya tetapi akan disimpan di MySQL sebagai 0000-00-00 00:00:00 di Date (bidang) - Datetime (datatype). Saya bermaksud menyimpan Tanggal dan Waktu saat ini. Jika saya menetapkan datatype sebagai Timestamp di database, bagaimana cara membuat kode di php?
Modular
Saya tidak diizinkan memposting komentar apa pun di Stackoverflow saat ini. Kedengarannya agak memalukan, tetapi itulah yang mereka lakukan terhadap saya.
Modular
Saya minta maaf untuk itu, tetapi jika Anda berada dalam mode suspensi sementara pasti ada alasan bagus. Sekarang salah satu kemungkinan kesalahan dalam kode dalam komentar Anda adalah bahwa Anda memberi nama field sebagai Date, itu kata yang disediakan untuk DATEtipe data dan hal-hal aneh mungkin terjadi (tergantung pada versi MySQL), jadi coba ganti nama menjadi sesuatu seperti creationdatedan lihat apa yang terjadi . Juga, dari PHP Anda harus memperlakukan TIMESTAMPbidang yang sama dengan DATETIMEbidang, tidak masalah kok. Formatnya sama.
yannis
Terima kasih banyak. Sudah diurutkan sekarang setelah menghabiskan hampir sepanjang malam berusaha mencari tahu mengapa. :)
Modular
2

Referensi yang diambil dari artikel ini:

Perbedaan utama:

TIMESTAMP digunakan untuk melacak perubahan pada 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 dikonversi secara internal zona waktu saat ini ke UTC untuk penyimpanan, dan selama pengambilan dikonversi kembali ke zona waktu saat ini. DATETIME tidak dapat melakukan ini.

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 ′

Landasan
sumber
1
Jadi di tahun 2040 apa yang akan Anda gunakan untuk perubahan pada catatan, Timestamp? Saya rasa tidak.
Bsienn
-1

Yah saya melihat ini dengan cara yang sangat sederhana. Dalam kasus Anda, saya akan menggunakan keduanya datetimedan timestamp. Dengan menggunakan keduanya Anda tidak akan memiliki masalah tambahan dengan menyimpan data atau sesuatu seperti itu. Satu bidang tambahan (kolom) di tabel Anda juga bukan masalah besar.

Jadi dalam sudut pandang dan pengalaman saya sejauh ini saya biasanya menggunakan keduanya. Ketika Anda ingin menunjukkan tanggal kepada pengunjung Anda atau membuatnya dimengerti oleh pengunjung, maka tampilkan tanggal dalam format waktu.

Format datetime bisa menjadi masalah ketika Anda ingin menghitung sesuatu (perbedaan antara 2 tanggal, dapatkan tanggal kemarin dari tanggal saat ini, dapatkan 1 minggu yang lalu dari tanggal saat ini, dapatkan tanggal besok atau sesuatu seperti itu.) Ini tidak terlalu sulit tetapi Anda biasanya akan perlu mengubahnya di timestampkemudian melakukan hal-hal. Dan ya datetime saat ini misalnya Anda dapatkan dengan: $current = date("Y-m-d");atau $current = date("Y-m-d H:i:s");jika Anda juga ingin berjam-jam, menit dan detik.

Stempel waktu hanya panjang angka 11 digit yang tidak benar-benar berarti. Ketika Anda melihatnya, Anda tidak akan tahu tanggal yang diwakilinya. Jadi itu tidak benar-benar ramah pengguna dan Anda tidak dapat menggunakannya untuk hanya menggemakannya dan menunjukkannya kepada pengunjung Anda misalnya. Anda perlu "mengubahnya" menjadi sesuatu yang bisa dibaca. Tapi itu juga menawarkan Anda kemampuan untuk dengan mudah mengubahnya, dan untuk menghitung tanggal yang berbeda. Misalnya jika Anda ingin mendapatkan cap waktu untuk hari esok pada saat yang sama Anda hanya menambahkan jumlah detik ke tanggal saat ini dan Anda memiliki cap waktu besok. Contoh: $tomorrow = time()+24*3600;Anda juga dapat dengan mudah mendapatkan perbedaan antara dua tanggal dalam hitungan detik atau sesuatu seperti itu.

Jadi saya akan menyarankan untuk menggunakan datetime dan cap waktu. Bahkan jika Anda menggunakan misalnya PhpMyadmin dan ingin cepat melihat beberapa data, akan lebih mudah bagi Anda ketika Anda melihat tanggal dalam format waktu tanggal (contoh 2011-12-20 10:15:20:) karena jika Anda hanya melihat angka 11digit. Jadi gunakan keduanya lalu panggil dan gunakan yang cocok untuk Anda.

Jika Anda harus atau ingin memilih satu saja, saya sarankan timestamp jika tidak gunakan keduanya.

Menandai
sumber
1
-1 Timestamp is just a number 11 digit long which doesn't really "mean" anythingStempel waktu MySQL disimpan dalam format yang sama dengan datetime. Anda perlu mengonversikannya ke cap waktu php juga, untuk melakukan perhitungan yang Anda uraikan, ATAU cukup menggunakan banyak fungsi tanggal / waktu MySQL dan melakukan perhitungan dalam basis data. Jawaban Anda tidak masuk akal.
yannis