Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk menyimpan masa dalam pangkalan data MySQL

Bagaimana untuk menyimpan masa dalam pangkalan data MySQL

WBOY
WBOYke hadapan
2023-06-03 16:00:211812semak imbas


    1. Ingat untuk tidak menggunakan rentetan untuk menyimpan tarikh

    Rentetan mengambil lebih banyak ruang!

    Kecekapan perbandingan tarikh storan rentetan adalah agak rendah (perbandingan aksara mengikut aksara), dan tidak boleh dikira dan dibandingkan menggunakan API berkaitan tarikh.

    2. Pilih antara Datetime dan Timestamp

    Datetime dan Timestamp ialah dua jenis data yang serupa untuk menyimpan masa yang disediakan oleh MySQL.

    Bagaimana untuk memilih antara mereka?

    Biasanya kami lebih suka Cap Waktu

    2.1 Jenis DateTime tidak mempunyai maklumat zon waktu

    Jenis DateTime tidak mempunyai maklumat zon waktu (zon masa tidak relevan)

    Bila anda Selepas zon waktu ditukar, sebagai contoh, jika pelayan anda menukar alamatnya atau menukar tetapan zon masa sambungan klien, ia akan menyebabkan masa anda membaca daripada pangkalan data menjadi tidak betul.

    Cap masa berkaitan dengan zon waktu.

    Nilai medan jenis Cap Masa akan berubah dengan perubahan zon waktu pelayan dan akan ditukar secara automatik kepada masa yang sepadan Secara ringkasnya, dalam zon waktu yang berbeza, nilai medan ini adalah berbeza untuk rekod yang sama ditanya.

    Mari berikan demonstrasi praktikal di bawah!

    Buat pernyataan SQL jadual:

    CREATE TABLE `time_zone_test` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `date_time` datetime DEFAULT NULL,
      `time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Sisipkan data:

    INSERT INTO time_zone_test(date_time,time_stamp) VALUES(NOW(),NOW());

    Lihat data:

    select dsqlate_time,time_stamp from time_zone_test;

    Hasil:

    +----------------------+---------------------+
    |. tarikh_masa 11 09:53:32 |
    +-------------- ------+-----------------------+

    Ubah suai zon waktu sesi semasa :
    set time_zone='+8:00';

    sekali lagi Lihat data:

    +----------------------+------ ------- ------+
    |. cap_masa |

    +---------------------+--. ------- ------------+
    | 2020-01-11 09:53:32 | ------- -------------+---------------------+


    Sambungan : Beberapa perintah sql biasa tentang tetapan zon waktu MySQL

    1 Lihat zon waktu sesi semasa

        SELECT @@session.time_zone;

    2 >
        SET time_zone = 'Europe/Helsinki';
        SET time_zone = "+00:00";

    3. Tetapan zon waktu global pangkalan data

        SELECT @@global.time_zone;

    4 Menetapkan zon waktu global

        SET GLOBAL time_zone = '+8:00';
        SET GLOBAL time_zone = 'Europe/Helsinki';

    2.2 Jenis DateTime menggunakan lebih banyak ruang

    Cap masa hanya perlu menggunakan 4. bait ruang storan, tetapi DateTime memerlukan lebih banyak ruang 8 bait ruang storan. Walau bagaimanapun, pendekatan ini juga menimbulkan isu bahawa Cap Waktu mempunyai julat masa yang lebih terhad.

    :1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
    • DateTime

      : 1970-01-01 00:00:01 ~ 2037-12-31 23:59:59
    • TimestampTimestamp mempunyai perbezaan yang ketara dalam versi MySQL yang berbeza.

    • 3. Mari kita lihat ruang storan jenis tarikh MySQL

    Rajah berikut menunjukkan ruang storan yang diduduki oleh jenis tarikh dalam versi MySQL 5.6:

    Dapat dilihat bahawa MySQL selepas 5.6.4 mempunyai tempat perpuluhan tambahan yang memerlukan 0 hingga 3 bait. DataTime dan Timestamp akan menduduki ruang storan yang berbeza apabila disimpan.

    Bagaimana untuk menyimpan masa dalam pangkalan data MySQLUntuk kemudahan, dalam artikel ini kami masih lalai bahawa Cap Waktu hanya memerlukan 4 bait ruang storan, tetapi DateTime memerlukan 8 bait ruang storan.

    4. Adakah cap waktu angka merupakan pilihan yang lebih baik?

    Banyak kali, kami juga menggunakan nilai jenis int atau bigint, iaitu cap masa, untuk mewakili masa.

    Kaedah storan ini mempunyai beberapa kelebihan jenis Cap Waktu, dan menggunakannya untuk melaksanakan operasi pengisihan tarikh dan perbandingan akan menjadi lebih cekap, dan ia juga sangat mudah merentas sistem . Kelemahannya juga jelas, iaitu, kebolehbacaan data terlalu lemah, dan anda tidak boleh melihat masa tertentu secara intuitif.

    Takrif cap masa adalah seperti berikut:

    Takrif cap masa bermula dari masa asas, iaitu "1970-1-1 00: 00:00 +0:00", bermula dari masa ini, dinyatakan sebagai integer, diukur dalam saat, kali ini integer terus meningkat seiring dengan berlalunya masa. Dengan cara ini, saya hanya memerlukan satu nilai untuk mewakili masa dengan sempurna, dan nilai ini adalah nilai mutlak, iaitu, tidak kira di mana anda berada di mana-mana sudut bumi, cap masa yang mewakili masa adalah sama, dijana Nilai-nilai semuanya sama, dan tiada konsep zon waktu, jadi tiada penukaran tambahan diperlukan semasa penghantaran masa dalam sistem Ia hanya ditukar kepada waktu tempatan dalam format rentetan apabila dipaparkan kepada pengguna.

    Operasi sebenar dalam pangkalan data:

    mysql> select UNIX_TIMESTAMP('2020-01-11 09:53:32');
    +---------------------------------------+
    | UNIX_TIMESTAMP('2020-01-11 09:53:32') |
    +---------------------------------------+
    |                            1578707612 |
    +---------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select FROM_UNIXTIME(1578707612);
    +---------------------------+
    | FROM_UNIXTIME(1578707612) |
    +---------------------------+
    | 2020-01-11 09:53:32       |
    +---------------------------+
    1 row in set (0.01 sec)

    5 Ringkasan

    Cap masa disyorkan kerana perwakilan berangka masa tidak cukup intuitif

    . Setiap cara Setiap satu mempunyai kelebihan tersendiri, dan cara terbaik untuk melakukannya adalah berdasarkan senario sebenar. Mari buat perbandingan ringkas bagi tiga kaedah ini untuk membantu anda memilih jenis data yang betul untuk masa penyimpanan dalam pembangunan sebenar:

    6.设置mysql date类型字段默认值支持0000格式

    [mysqld]
    sql-mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

    Atas ialah kandungan terperinci Bagaimana untuk menyimpan masa dalam pangkalan data MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam