MySQL DATETIME 数据类型
简介:在本教程中,您将了解MySQL
DATETIME
数据类型以及如何使用一些函数进行有效操作 。
MySQL DATETIME数据类型简介
您使用MySQLDATETIME
来存储包含日期和时间的值。当您 查询数据从一个DATETIME
栏时,MySQL显示DATETIME
在下面的格式值:
YYYY-MM-DD HH:MM:SS默认情况下,
DATETIME
值的范围1000-01-01 00:00:00
为9999-12-31 23:59:59
。
DATETIME
值使用5个字节存储。另外,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个字节用于小数秒精度。
注意:在MySQL 5.6.4之前,DATETIME
值需要8个字节的存储而不是5个字节。
MySQL DATETIME与TIMESTAMP
MySQL提供了另一种时态数据类型,一种类似于被TIMESTAMP
调用DATETIME
。
在TIMESTAMP
需要4个字节,而DATETIME
需要5个字节。二者TIMESTAMP
和DATETIME
需要分数秒精度的额外字节。
TIMESTAMP
值范围从1970-01-01 00:00:01 UTC
到2038-01-19 03:14:07 UTC
。如果要存储超过2038的时间值,则应使用DATETIME
而不是TIMESTAMP
。
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;
+---------------------+---------------------+ | ts | dt | +---------------------+---------------------+ | 2019-08-14 11:37:32 | 2019-08-14 11:37:32 | +---------------------+---------------------+ 1 row in set (0.00 sec)
DATETIME
和TIMESTAMP
列中的值都相同。
最后,将连接的时区设置为+03:00
并再次从timestamp_n_datetime
表中查询数据。
SET time_zone = '+03:00'; SELECT ts, dt FROM timestamp_n_datetime;
+---------------------+---------------------+ | ts | dt | +---------------------+---------------------+ | 2019-08-14 06:37:32 | 2019-08-14 11:37:32 | +---------------------+---------------------+ 1 row in set (0.00 sec)如您所见,
TIMESTAMP
列中的值不同。这是因为当我们更改时区时,TIMESTAMP
列以UTC格式存储日期和时间值,根据新时区调整列的值。
这意味着如果您使用TIMESTAMP
数据存储日期和时间值,则在将数据库移动到位于不同时区的服务器时应认真考虑。
MySQL DATETIME函数
以下语句使用NOW()
函数将变量@dt
设置为当前日期和时间。
SET @dt = NOW();要查询
@dt
变量的值,请使用以下 SELECT
语句:
SELECT @dt;
+---------------------+ | @dt | +---------------------+ | 2019-08-14 06:40:33 | +---------------------+ 1 row in set (0.00 sec)
MySQL DATE函数
要从值中提取日期部分DATETIME
,请使用以下DATE
函数:
SELECT DATE(@dt);
+------------+ | DATE(@dt) | +------------+ | 2019-08-14 | +------------+ 1 row in set (0.00 sec)如果您希望根据日期查询数据,但此列中存储的数据基于日期和时间,则此功能非常有用。 我们来看下面的例子。
CREATE TABLE test_dt ( id INT AUTO_INCREMENT PRIMARY KEY, created_at DATETIME ); INSERT INTO test_dt(created_at) VALUES('2015-11-05 14:29:36');假设您想知道在哪个行上创建
2015-11-05
,请使用以下查询:
SELECT * FROM test_dt WHERE created_at = '2015-11-05';它不返回任何行。 这是因为
created_at
列不仅包含日期,还包含时间。要更正它,请使用以下DATE
函数:
SELECT * FROM test_dt WHERE DATE(created_at) = '2015-11-05';
+----+---------------------+ | id | created_at | +----+---------------------+ | 1 | 2015-11-05 14:29:36 | +----+---------------------+ 1 row in set (0.00 sec)它按预期返回一行。如果表有很多行,MySQL必须执行全表扫描以找到与条件匹配的行。
MySQL TIME功能
要从DATETIME
值中提取时间部分,请使用TIME
函数:
SELECT TIME(@dt);
+-----------+ | TIME(@dt) | +-----------+ | 06:40:33 | +-----------+ 1 row in set (0.00 sec)
MySQL年,季度,月,周,日,小时,分钟和秒函数
要从值中获取年,季度,月,周,日,小时,分钟和秒DATETIME
,可以使用以下语句中所示的函数:
SELECT HOUR(@dt), MINUTE(@dt), SECOND(@dt), DAY(@dt), WEEK(@dt), MONTH(@dt), QUARTER(@dt), YEAR(@dt);
+-----------+-------------+-------------+----------+-----------+------------+--------------+-----------+ | HOUR(@dt) | MINUTE(@dt) | SECOND(@dt) | DAY(@dt) | WEEK(@dt) | MONTH(@dt) | QUARTER(@dt) | YEAR(@dt) | +-----------+-------------+-------------+----------+-----------+------------+--------------+-----------+ | 6 | 40 | 33 | 14 | 32 | 8 | 3 | 2019 | +-----------+-------------+-------------+----------+-----------+------------+--------------+-----------+ 1 row in set (0.00 sec)
MySQL DATE_FORMAT函数
要格式化DATETIME
值,请使用DATE_FORMAT
函数。例如,以下语句DATETIME
根据%H:%i:%s - %W %M %Y
格式格式化值:
SELECT DATE_FORMAT(@dt, '%H:%i:%s - %W %M %Y');
+-----------------------------------------+ | DATE_FORMAT(@dt, '%H:%i:%s - %W %M %Y') | +-----------------------------------------+ | 06:40:33 - Wednesday August 2019 | +-----------------------------------------+ 1 row in set (0.01 sec)
MySQL DATE_ADD函数
要为DATETIME
值添加间隔 值,请使用以下DATE_ADD
函数:
SELECT @dt 开始, DATE_ADD(@dt, INTERVAL 1 SECOND) '1 秒后', DATE_ADD(@dt, INTERVAL 1 MINUTE) '1 分后', DATE_ADD(@dt, INTERVAL 1 HOUR) '1 小时后', DATE_ADD(@dt, INTERVAL 1 DAY) '1 天后', DATE_ADD(@dt, INTERVAL 1 WEEK) '1 周后', DATE_ADD(@dt, INTERVAL 1 MONTH) '1 月后', DATE_ADD(@dt, INTERVAL 1 YEAR) '1 年后';
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+ | 开始 | 1 秒后 | 1 分后 | 1 小时后 | 1 天后 | 1 周后 | 1 月后 | 1 年后 | +---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+ | 2019-08-14 06:40:33 | 2019-08-14 06:40:34 | 2019-08-14 06:41:33 | 2019-08-14 07:40:33 | 2019-08-15 06:40:33 | 2019-08-21 06:40:33 | 2019-09-14 06:40:33 | 2020-08-14 06:40:33 | +---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
MySQL DATE_SUB函数
要从DATETIME
值中减去间隔,请使用以下DATE_SUB
函数:
SELECT @dt 开始, DATE_SUB(@dt, INTERVAL 1 SECOND) '1 秒前', DATE_SUB(@dt, INTERVAL 1 MINUTE) '1 分前', DATE_SUB(@dt, INTERVAL 1 HOUR) '1 小时前', DATE_SUB(@dt, INTERVAL 1 DAY) '1 天前', DATE_SUB(@dt, INTERVAL 1 WEEK) '1 周前', DATE_SUB(@dt, INTERVAL 1 MONTH) '1 月前', DATE_SUB(@dt, INTERVAL 1 YEAR) '1 年前';
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+ | 开始 | 1 秒前 | 1 分前 | 1 小时前 | 1 天前 | 1 周前 | 1 月前 | 1 年前 | +---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+ | 2019-08-14 06:40:33 | 2019-08-14 06:40:32 | 2019-08-14 06:39:33 | 2019-08-14 05:40:33 | 2019-08-13 06:40:33 | 2019-08-07 06:40:33 | 2019-07-14 06:40:33 | 2018-08-14 06:40:33 | +---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+ 1 row in set (0.00 sec)
MySQL DATE_DIFF函数
要计算两个DATETIME
值之间的天数差异,请使用DATEDIFF
函数。请注意,DATEDIFF
函数仅考虑DATETIME
计算中值的日期部分。
请参阅以下示例。
首先,创建一个表名为datediff_test
具有一个数据类型为的列的DATETIME
。
CREATE TABLE datediff_test ( dt DATETIME );其次,在
datediff_test
表中插入一些行。
INSERT INTO datediff_test(dt) VALUES('2010-04-30 07:27:39'), ('2010-05-17 22:52:21'), ('2010-05-18 01:19:10'), ('2010-05-22 14:17:16'), ('2010-05-26 03:26:56'), ('2010-06-10 04:44:38'), ('2010-06-13 13:55:53');第三,使用
DATEDIFF
函数将当前日期和时间与datediff_test
表格每行中的值进行比较。
SELECT dt, DATEDIFF(NOW(), dt) FROM datediff_test;
+---------------------+---------------------+ | dt | DATEDIFF(NOW(), dt) | +---------------------+---------------------+ | 2010-04-30 07:27:39 | 3393 | | 2010-05-17 22:52:21 | 3376 | | 2010-05-18 01:19:10 | 3375 | | 2010-05-22 14:17:16 | 3371 | | 2010-05-26 03:26:56 | 3367 | | 2010-06-10 04:44:38 | 3352 | | 2010-06-13 13:55:53 | 3349 | +---------------------+---------------------+ 7 rows in set (0.00 sec)在本教程中,您已经了解了MySQL
DATETIME
数据类型和一些有用的DATETIME
函数。