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?
- Apa kode di php untuk menyimpan tanggal pembelian (tanggal saat ini) dan kemudian menyimpan dalam database?
- Tolong jelaskan bagaimana cara menggunakan masing-masing karena setelah membaca banyak penjelasan di internet, saya masih belum mengerti.
Jawaban:
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 UTC
hingga2038-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:00
hingga9999-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 nol0000-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 adalahTIMESTAMP
.Dan tentu saja ada juga
DATE
danTIME
, yang berfungsi seperti ituDATETIME
, tetapi tentu sajaDATE
tidak peduli waktu danTIME
tidak 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
DATETIME
mana-mana. Bukan karena alasan teknis, tetapi karena Anda masih tidak jelas tentang cara kerja MySQL,DATETIME
adalah pilihan yang lebih sederhana. Ini berarti Anda harus menghitung cap waktu saat ini di PHP sebelum menyimpan, semudah:Fungsi tanggal PHP berfungsi seperti:
The
"Y-m-d H:i:s"
Format adalah salah satu yang kompatibel dengan MySQL dan dengan meninggalkan parameter kedua kosong,date()
panggilantime()
untuk mendapatkan arus UNIX timestamp .Menggunakan
TIMESTAMP
bukanDATETIME
memiliki 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 menggunakanDATETIME
semuanya 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.
sumber
Date
, itu kata yang disediakan untukDATE
tipe data dan hal-hal aneh mungkin terjadi (tergantung pada versi MySQL), jadi coba ganti nama menjadi sesuatu seperticreationdate
dan lihat apa yang terjadi . Juga, dari PHP Anda harus memperlakukanTIMESTAMP
bidang yang sama denganDATETIME
bidang, tidak masalah kok. Formatnya sama.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 ′
sumber
Yah saya melihat ini dengan cara yang sangat sederhana. Dalam kasus Anda, saya akan menggunakan keduanya
datetime
dantimestamp
. 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
timestamp
kemudian 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.
sumber
Timestamp is just a number 11 digit long which doesn't really "mean" anything
Stempel 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.