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函数。 