Pertanyaan Haruskah saya menggunakan tipe data datetime atau timestamp di MySQL?


Akankah Anda merekomendasikan menggunakan tanggal Waktu atau a cap waktu lapangan, dan mengapa (menggunakan MySQL)?

Saya bekerja dengan PHP di sisi server.


2299
2018-01-03 16:14


asal


Jawaban:


Stempel waktu di MySQL umumnya digunakan untuk melacak perubahan pada rekaman, dan sering diperbarui setiap kali catatan diubah. Jika Anda ingin menyimpan nilai tertentu, Anda harus menggunakan bidang datetime.

Jika Anda berarti Anda ingin memutuskan antara menggunakan cap waktu UNIX atau bidang datetime MySQL asli, gunakan format asli. Anda dapat melakukan perhitungan dalam MySQL dengan cara itu ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)") dan mudah untuk mengubah format nilai menjadi cap waktu UNIX ("SELECT UNIX_TIMESTAMP(my_datetime)") saat Anda memeriksa catatan jika Anda ingin mengoperasikannya dengan PHP.


1555
2018-01-03 16:26



Di MySQL 5 dan di atasnya, TIMESTAMP nilai dikonversi dari zona waktu saat ini ke UTC untuk penyimpanan, dan dikonversi kembali dari UTC ke zona waktu saat ini untuk pengambilan. (Ini hanya terjadi untuk tipe data TIMESTAMP, dan tidak untuk jenis lain seperti DATETIME.)

Secara default, zona waktu saat ini untuk setiap koneksi adalah waktu server. Zona waktu dapat diatur berdasarkan per-koneksi, seperti yang dijelaskan dalam Dukungan Zona Waktu Server MySQL.


814
2018-03-02 11:49



Saya selalu menggunakan bidang DATETIME untuk apa pun selain metadata baris (tanggal dibuat atau diubah).

Sebagai tersebut dalam dokumentasi MySQL:

Jenis DATETIME digunakan ketika Anda membutuhkan nilai yang berisi informasi tanggal dan waktu. MySQL mengambil dan menampilkan nilai DATETIME dalam format 'YYYY-MM-DD HH: MM: SS'. Rentang yang didukung adalah '1000-01-01 00:00:00' hingga '9999-12-31 23:59:59'.

...

Jenis data TIMESTAMP memiliki rentang '1970-01-01 00:00:01' UTC hingga '2038-01-09 03:14:07' UTC. Ini memiliki sifat yang bervariasi, tergantung pada versi MySQL dan mode SQL server berjalan masuk

Anda kemungkinan besar mencapai batas bawah pada TIMESTAMPs dalam penggunaan umum - mis. menyimpan tanggal lahir.


430
2018-01-04 04:26



Contoh di bawah ini menunjukkan bagaimana TIMESTAMP jenis tanggal mengubah nilai setelah mengubah time-zone to 'america/new_york' dimana DATETIMEtidak berubah.

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+

Saya telah mengonversi jawaban saya menjadi artikel sehingga lebih banyak orang dapat menemukan ini berguna, MySQL: Datetime Versus Jenis Data Timestamp.


284
2017-08-21 08:45



Perbedaan utama adalah DATETIME adalah konstan sementara TIMESTAMP dipengaruhi oleh time_zone pengaturan.

Jadi itu hanya masalah ketika Anda memiliki - atau mungkin di masa depan memiliki - kelompok yang disinkronkan di seluruh zona waktu.

Dengan kata yang lebih sederhana: Jika saya memiliki database di Australia, dan mengambil basis data itu untuk menyinkronkan / mengisi database di Amerika, maka TIMESTAMP akan diperbarui untuk mencerminkan waktu nyata dari peristiwa di zona waktu baru, sementara DATETIME masih akan mencerminkan waktu acara di zona waktu au.

Contoh hebat DATETIME yang digunakan di mana TIMESTAMP seharusnya digunakan adalah di Facebook, di mana server mereka tidak pernah yakin apa waktu yang terjadi di zona waktu. Setelah saya melakukan percakapan di mana waktu mengatakan saya membalas pesan sebelum pesan itu benar-benar dikirim. (Ini, tentu saja, bisa juga disebabkan oleh penerjemahan zona waktu yang buruk dalam perangkat lunak olahpesan jika waktu telah diposting daripada disinkronkan.)


169
2018-01-14 14:26



Saya membuat keputusan ini pada basis semantik.

Saya menggunakan stempel waktu saat saya perlu merekam titik tetap (kurang lebih) pada waktunya. Misalnya ketika catatan dimasukkan ke dalam database atau ketika beberapa tindakan pengguna terjadi.

Saya menggunakan bidang datetime ketika tanggal / waktu dapat diatur dan diubah secara sewenang-wenang. Misalnya ketika seorang pengguna dapat menyimpan kemudian mengubah janji.


109
2018-01-03 17:11



TIMESTAMP adalah 4 byte Vs 8 byte untuk DATETIME.

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

Tapi seperti scronide mengatakan itu memang memiliki batas bawah tahun 1970. Ini bagus untuk apa pun yang mungkin terjadi di masa depan;)


86
2018-01-04 09:00



  1. TIMESTAMP adalah empat byte vs delapan byte untuk DATETIME.

  2. Stempel waktu juga lebih ringan pada basisdata dan diindeks lebih cepat.

  3. Jenis DATETIME digunakan ketika Anda membutuhkan nilai yang berisi informasi tanggal dan waktu. MySQL mengambil dan menampilkan nilai DATETIME dalam format 'YYYY-MM-DD HH: MM: SS'. Rentang yang didukung adalah '1000-01-01 00:00:00 ′ hingga' 9999-12-31 23:59:59 ′.

Jenis data TIMESTAMP memiliki rentang '1970-01-01 00:00:01 ′ UTC to' 2038-01-09 03:14:07 ′ UTC. Ini memiliki sifat yang bervariasi, tergantung pada versi MySQL dan mode SQL server berjalan masuk

  1. DATETIME adalah konstan sementara TIMESTAMP dipengaruhi oleh pengaturan time_zone.

80
2017-12-21 11:12



Saya sarankan untuk menggunakan tidak juga bidang DATETIME atau TIMESTAMP. Jika Anda ingin mewakili hari tertentu secara keseluruhan (seperti ulang tahun), kemudian gunakan jenis DATE, tetapi jika Anda lebih spesifik dari itu, Anda mungkin tertarik untuk merekam momen aktual dibandingkan dengan unit waktu (hari, minggu, bulan, tahun). Alih-alih menggunakan DATETIME atau TIMESTAMP, gunakan BIGINT, dan cukup simpan jumlah milidetik sejak zaman (System.currentTimeMillis () jika Anda menggunakan Java). Ini memiliki beberapa keunggulan:

  1. Anda menghindari kunci vendor. Hampir semua basis data mendukung bilangan bulat dalam mode yang relatif serupa. Misalkan Anda ingin pindah ke database lain. Apakah Anda ingin khawatir tentang perbedaan antara nilai DATETIME MySQL dan bagaimana Oracle mendefinisikannya? Bahkan di antara berbagai versi MySQL, TIMESTAMPS memiliki tingkat presisi yang berbeda. Itu baru-baru ini bahwa milidetik yang didukung oleh MySQL dalam stempel waktu.
  2. Tidak ada masalah zona waktu. Sudah ada beberapa komentar mendalam tentang apa yang terjadi dengan zona waktu dengan tipe data yang berbeda. Tetapi apakah ini pengetahuan umum, dan akankah rekan kerja Anda meluangkan waktu untuk mempelajarinya? Di sisi lain, cukup sulit mengacaukan mengubah BigINT menjadi java.util.Date. Menggunakan BIGINT menyebabkan banyak masalah dengan zona waktu jatuh di pinggir jalan.
  3. Jangan khawatir tentang rentang atau presisi. Anda tidak perlu khawatir tentang apa yang dipotong pendek oleh rentang tanggal mendatang (TIMESTAMP hanya pergi ke 2038).
  4. Integrasi alat pihak ketiga. Dengan menggunakan integer, itu sepele untuk alat pihak ke-3 (misalnya EclipseLink) untuk berinteraksi dengan database. Tidak semua alat pihak ketiga akan memiliki pemahaman yang sama tentang "datetime" seperti yang dilakukan MySQL. Ingin mencoba dan mencari tahu di Hibernate apakah Anda harus menggunakan objek java.sql.TimeStamp atau java.util.Date jika Anda menggunakan tipe data kustom ini? Menggunakan tipe data dasar Anda membuat penggunaan dengan alat pihak ketiga sepele.

Masalah ini terkait erat bagaimana Anda harus menyimpan nilai uang (yaitu $ 1,99) dalam database. Haruskah Anda menggunakan Desimal, atau tipe uang database, atau yang terburuk dari semua yang Double? Semua 3 opsi ini mengerikan, karena banyak alasan yang sama yang tercantum di atas. Solusinya adalah dengan menyimpan nilai uang dalam sen menggunakan BIGINT, dan kemudian mengubah sen menjadi dolar ketika Anda menampilkan nilai kepada pengguna. Pekerjaan database adalah menyimpan data, dan TIDAK mengartikan data itu. Semua jenis data mewah yang Anda lihat dalam basis data (terutama Oracle) menambah sedikit, dan memulai Anda di jalan menuju kunci vendor.


74
2018-06-11 23:02