mempunyai 5 jenis: 1. YEAR, digunakan untuk mewakili tahun, formatnya ialah "YYYY"; 2. TIME, digunakan untuk nilai yang hanya memerlukan maklumat masa, formatnya ialah "HH:MM: SS"; 3 , DATE, digunakan apabila hanya nilai tarikh diperlukan, formatnya ialah "YYYY-MM-DD"; 4. DATETIME, digunakan untuk nilai yang perlu mengandungi maklumat tarikh dan masa, formatnya ialah "YYYY-MM-DD HH:MM:SS" ;5. TIMESTAMP, serupa dengan DATETIME, digunakan untuk nilai yang perlu mengandungi maklumat tarikh dan masa.
Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.
Terdapat berbilang jenis data yang mewakili tarikh dalam MySQL: YEAR, TIME, DATE, DTAETIME, TIMESTAMP.
类型名称 | 日期格式 | 日期范围 | 存储需求 |
---|---|---|---|
YEAR | YYYY | 1901 ~ 2155 | 1 个字节 |
TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 3 个字节 |
DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-3 | 3 个字节 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8 个字节 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC | 4 个字节 |
Jenis TAHUN
Jenis YEAR ialah jenis bait tunggal yang digunakan untuk mewakili tahun, hanya memerlukan 1 bait untuk storan. YEAR boleh ditentukan dalam pelbagai format, seperti berikut:
TAHUN dinyatakan dalam rentetan 4 digit atau format nombor 4 digit, antara '1901' hingga '2155'. Format input ialah 'YYYY' atau YYYY Contohnya, jika anda memasukkan '2010' atau 2010, nilai yang dimasukkan ke dalam pangkalan data ialah 2010.
TAHUN diwakili sebagai rentetan 2 digit dalam julat '00' hingga '99'. Nilai dalam julat '00' hingga '69' dan '70' hingga '99' ditukar kepada nilai YEAR dalam julat 2000 hingga 2069 dan 1970 hingga 1999 masing-masing. '0' mempunyai kesan yang sama seperti '00'. Nilai yang dimasukkan di luar julat akan ditukar kepada 2000.
TAHUN dinyatakan sebagai nombor 2 digit, antara 1 hingga 99. Nilai dalam julat 1 hingga 99 dan 70 hingga 99 ditukar kepada TAHUN dalam julat 2001 hingga 2069 dan 1970 hingga 1999 nilai masing-masing. Ambil perhatian bahawa di sini nilai 0 akan ditukar kepada 0000, bukan 2000.
Petua: Julat integer dua digit berbeza sedikit daripada julat rentetan dua digit. Contohnya, untuk memasukkan tahun 3000, pembaca mungkin menggunakan format angka 0 untuk mewakili TAHUN, tetapi sebenarnya, nilai yang dimasukkan ke dalam pangkalan data ialah 0000, bukan 3000 seperti yang dijangkakan. Hanya '0' atau '00' dalam format rentetan boleh ditafsirkan dengan betul sebagai 3000, nilai YEAR haram akan ditukar kepada 0000.
Jenis MASA
Jenis MASA digunakan untuk nilai yang hanya memerlukan maklumat masa dan memerlukan 3 bait untuk storan. Formatnya ialah HH:MM:SS
. HH mewakili jam, MM mewakili minit, dan SS mewakili saat.
Julat nilai jenis MASA ialah -838:59:59~838:59:59 Sebab mengapa bahagian jam begitu besar ialah jenis MASA bukan sahaja boleh digunakan untuk mewakili masa hari (mesti kurang daripada 24 jam), Ia juga boleh menjadi masa sejak peristiwa atau masa antara dua peristiwa (yang boleh melebihi 24 jam, atau negatif).
Nilai MASA boleh ditentukan menggunakan pelbagai format, seperti ditunjukkan di bawah.
Rentetan dalam format 'D HH:MM:SS'. Sintaks "tidak ketat" ini juga boleh digunakan: 'HH:MM:SS', 'HH:MM', 'D HH' atau 'SS'. D di sini mewakili hari, yang boleh mengambil nilai antara 0 dan 34. Apabila memasukkan ke dalam pangkalan data, D ditukar kepada jam dan disimpan dalam format "D*24 HH".
Format 'HHMMSS', rentetan tanpa pemisah atau nilai berangka dalam format HHMMSS, dengan mengandaikan masa yang bermakna. Sebagai contoh, '101112' difahami sebagai '10:11:12', tetapi '106112' adalah haram (ia mempunyai bahagian minit yang tidak bermakna) dan akan menjadi 00:00:00 apabila disimpan.
Petua: Berhati-hati apabila memberikan nilai singkatan ke lajur TIME: tanpa titik bertindih, MySQL menganggap bahawa dua digit paling kanan mewakili saat apabila mentafsir nilai. (MySQL mentafsir nilai TIME sebagai masa lalu dan bukannya masa semasa). Sebagai contoh, pembaca mungkin berfikir '1112' dan 1112 bermakna 11:12:00 (iaitu, 12 minit selepas pukul 11), tetapi MySQL mentafsirkannya sebagai 00:11:12 (iaitu, 11 minit dan 12 saat ). Begitu juga '12' dan 12 ditafsirkan sebagai 00:00:12. Sebaliknya, jika titik bertindih digunakan dalam nilai TIME, ia pasti dianggap sebagai masa dalam sehari, iaitu, '11:12' bermaksud 11:12:00, bukan 00:11:12.
Contoh
Mari kita lihat contoh penggunaan jenis data dalam jadual TIME.
Mula-mula, buat jadual baharu bernama ujian dengan empat lajur: id, nama, start_at dan end_at. Jenis data lajur start_at dan end_at ialah TIME.
CREATE TABLE tests ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, start_at TIME, end_at TIME );
Kedua, masukkan baris dalam jadual ujian.
INSERT INTO tests(name,start_at,end_at) VALUES('Test 1', '08:00:00','10:00:00');
Ketiga, data pertanyaan daripada jadual ujian.
SELECT name, start_at, end_at FROM tests;
Jenis TARIKH
Jenis TARIKH digunakan apabila hanya nilai tarikh diperlukan, tanpa bahagian masa, memerlukan 3 bait untuk penyimpanan. Format tarikh ialah 'YYYY-MM-DD', di mana YYYY mewakili tahun, MM mewakili bulan dan DD mewakili hari.
Apabila memberikan nilai kepada medan jenis DATE, anda boleh menggunakan jenis rentetan atau sisipan data jenis angka, selagi ia mematuhi format tarikh DATE. Seperti yang ditunjukkan di bawah:
Tarikh yang dinyatakan dalam format aksara 'YYYY-MM-DD' atau 'YYYYMMDD', julat nilai ialah '1000-01-01'~'9999 - 12-3'. Sebagai contoh, masukkan '2015-12-31' atau '20151231', dan tarikh yang dimasukkan ke dalam pangkalan data ialah 2015-12-31.
以 'YY-MM-DD' 或者 'YYMMDD' 字符串格式表示日期,在这里YY表示两位的年值。MySQL 解释两位年值的规则:'00~69' 范围的年值转换为 '2000~2069','70~99' 范围的年值转换为 '1970~1999'。例如,输入 '15-12-31',插入数据库的日期为 2015-12-31;输入 '991231',插入数据库的日期为 1999-12-31。
以 YYMMDD 数字格式表示的日期,与前面相似,00~69 范围的年值转换为 2000~2069,80~99 范围的年值转换为 1980~1999。例如,输入 151231,插入数据库的日期为 2015-12-31,输入 991231,插入数据库的日期为 1999-12-31。
使用 CURRENT_DATE 或者 NOW(),插入当前系统日期。
示例
我们来看看下面的例子。
首先,创建一个新表名为people,其中出生日期列为DATE数据类型。
CREATE TABLE people ( id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, birth_date DATE NOT NULL );
接下来,在people表中插入一行。
INSERT INTO people(first_name,last_name,birth_date) VALUES('John','Doe','1990-09-01');
然后,查询数据来自people表。
SELECT first_name, last_name, birth_date FROM people;
之后,使用两位数年份格式将数据插入people表中。
INSERT INTO people(first_name,last_name,birth_date) VALUES('Jack','Daniel','01-09-01'), ('Lily','Bush','80-09-01');
在第一行中,我们使用01(范围00-69)作为年份,因此MySQL将其转换为2001年。在第二行中,我们使用80(范围70-99)作为年份,MySQL将其转换为1980年。
最后,我们可以从people表中查询数据,以检查数据是否已根据转换规则进行转换。
SELECT first_name, last_name, birth_date FROM people;
DATETIME 类型
DATETIME 类型用于需要同时包含日期和时间信息的值,在存储时需要 8 个字节。日期格式为 'YYYY-MM-DD HH:MM:SS
',其中 YYYY 表示年,MM 表示月,DD 表示日,HH 表示小时,MM 表示分钟,SS 表示秒。
在给 DATETIME 类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合 DATETIME 的日期格式即可,如下所示。
以 'YYYY-MM-DD HH:MM:SS' 或者 'YYYYMMDDHHMMSS' 字符串格式表示的日期,取值范围为 '1000-01-01 00:00:00'~'9999-12-3 23:59:59'。例如,输入 '2014-12-31 05:05:05' 或者 '20141231050505’,插入数据库的 DATETIME 值都为 2014-12-31 05:05:05。
以 'YY-MM-DD HH:MM:SS' 或者 'YYMMDDHHMMSS' 字符串格式表示的日期,在这里 YY 表示两位的年值。与前面相同,'00~79' 范围的年值转换为 '2000~2079','80~99' 范围的年值转换为 '1980~1999'。例如,输入 '14-12-31 05:05:05',插入数据库的 DATETIME 为 2014-12-31 05:05:05;输入 141231050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05。
以 YYYYMMDDHHMMSS 或者 YYMMDDHHMMSS 数字格式表示的日期和时间。例如,输入 20141231050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05;输入 140505050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05。
DATETIME值可以包括具有YYYY-MM-DD HH:MM:SS[.fraction]例如的格式的尾随小数秒到微秒 2015-12-20 10:01:00.999999。包含小数秒精度时,DATETIME值需要更多存储空间,如下表所示:
分数秒精度 | 存储 (字节) |
---|---|
0 | 0 |
1, 2 | 1 |
3, 4 | 2 |
5, 6 | 3 |
例如,2015-12-20 10:01:00.999999 需要8个字节,5个字节用于2015-12-20 10:01:00 ,3个字节用于.999999 而2015-12-20 10:01:00.9 只需要6个字节,1个字节用于小数秒精度。
TIMESTAMP 类型
TIMESTAMP 的显示格式与 DATETIME 相同,显示宽度固定在 19 个字符,日期格式为 YYYY-MM-DD HH:MM:SS,在存储时需要 4 个字节。但是 TIMESTAMP 列的取值范围小于 DATETIME 的取值范围,为 '1970-01-01 00:00:01'UTC~'2038-01-19 03:14:07'UTC。在插入数据时,要保证在合法的取值范围内。
提示:协调世界时(英:Coordinated Universal Time,法:Temps Universel Coordonné)又称为世界统一时间、世界标准时间、国际协调时间。英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称 UTC。
TIMESTAMP 与 DATETIME 除了存储字节和支持的范围不同外,还有一个最大的区别是:
DATETIME 在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;
而 TIMESTAMP 值的存储是以 UTC(世界标准时间)格式保存的,存储时对当前时区进行转换,检索时再转换回当前时区。即查询时,根据当前时区的不同,显示的时间值是不同的。
提示:如果为一个 DATETIME 或 TIMESTAMP 对象分配一个 DATE 值,结果值的时间部分被设置为 '00:00:00',因此 DATE 值未包含时间信息。如果为一个 DATE 对象分配一个 DATETIME 或 TIMESTAMP 值,结果值的时间部分被删除,因此DATE 值未包含时间信息。
MySQL TIMESTAMP以UTC值存储。但是,MySQL将DATETIME值存储为没有时区的值。我们来看下面的例子。
首先,将当前连接的时区设置为+00:00。
SET time_zone = '+00:00';
接下来,创建一个表命名timestamp_n_datetime是由两列组成:ts与dt用TIMESTAMP和DATETIME使用下面的语句类型。
CREATE TABLE timestamp_n_datetime ( id INT AUTO_INCREMENT PRIMARY KEY, ts TIMESTAMP, dt DATETIME );
然后,将当前日期和时间插入 timestamp_n_datetime 表的两个ts和每dt列 ,
INSERT INTO timestamp_n_datetime(ts,dt) VALUES(NOW(),NOW());
之后,从timestamp_n_datetime表中查询数据。
SELECT ts, dt FROM timestamp_n_datetime;
DATETIME和TIMESTAMP列中的值都相同。
最后,将连接的时区设置为+03:00并再次从timestamp_n_datetime表中查询数据。
SET time_zone = '+03:00'; SELECT ts, dt FROM timestamp_n_datetime;
如您所见,TIMESTAMP列中的值不同。这是因为当我们更改时区时,TIMESTAMP列以UTC格式存储日期和时间值,根据新时区调整列的值。
这意味着如果您使用TIMESTAMP数据存储日期和时间值,则在将数据库移动到位于不同时区的服务器时应认真考虑。
【相关推荐:mysql视频教程】
Atas ialah kandungan terperinci Apakah jenis yang digunakan untuk tarikh mysql?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!