轻松上手,快乐学习!

MySQL 教程

MySQL 首页MySQL 介绍MySQL 安装MySQL 实例库下载MySQL 实例库导入MySQL SELECTMySQL DISTINCTMySQL ORDER BYMySQL WHEREMySQL ANDMySQL ORMySQL INMySQL BETWEENMySQL LIKEMySQL LIMITMySQL IS NULLMySQL 别名MySQL JOINSMySQL INNER JOINMySQL LEFT JOINMySQL RIGHT JOINMySQL CROSS JOINMySQL SELF JOINMySQL GROUP BYMySQL HAVINGMySQL ROLLUPMySQL 子查询MySQL 派生表MySQL EXISTSMySQL CTEMySQL 递归 CTEMySQL UNIONMySQL INTERSECTMySQL MINUSMySQL INSERTMySQL INSERT INTO SELECTMySQL INSERT IGNOREMySQL UPDATEMySQL UPDATE JOINMySQL DELETEMySQL ON DELETE CASCADEMySQL DELETE JOINMySQL REPLACEMySQL PREPAREMySQL 事务MySQL 表锁定MySQL USEMySQL 数据库管理MySQL CREATE DATABASEMySQL DROP DATABASEMySQL 存储引擎MySQL CREATE TABLEMySQL 序列MySQL ALTER TABLEMySQL RENAME TABLEMySQL DROP COLUMNMySQL ADD COLUMNMySQL DROP TABLEMySQL 临时表MySQL TRUNCATE TABLEMySQL 数据类型MySQL NOT NULLMySQL Primary KeyMySQL Foreign KeyMySQL UNIQUEMySQL CHECKMySQL 字符集MySQL 排序规则MySQL 导入 CSVMySQL 导出 CSVMySQL 自然排序MySQL 基础MySQL NOT INMySQL Storage Engines

MySQL 存储过程

MySQL 存储过程介绍MySQL 存储过程实例MySQL 存储过程变量MySQL 存储过程参数MySQL 存储过程返回多值MySQL IF 语句MySQL CASE 语句MySQL IF CASE 选择MySQL 存储过程循环MySQL 存储过程游标MySQL 存储过程列表MySQL 存储过程异常处理MySQL SIGNAL 和 RESIGNALMySQL 存储函数MySql 自定义存储

MySQL 视图

MySQL 视图教程SQL 视图介绍MySQL 视图介绍MySQL 创建视图MySQL 可更新视图WITH CHECK OPTIONLOCAL&CASCADEDMySQL 视图管理

MySQL 触发器

MySQL 触发器SQL 触发器MySQL 触发器介绍MySQL 触发器的创建MySQL 创建多个触发器MySQL 触发器管理MySQL 计划事件MySQL事件修改

MySQL 索引

MySQL 索引MySQL 索引创建MySQL 索引删除MySQL 显示索引MySQL 唯一索引MySQL 前缀索引MySQL 隐形索引MySQL 降序索引MySQL 复合索引MySQL 聚集索引MySQL 索引基数MySQL USE INDEXMySQL 强制索引

MySQL 管理

MySQL 管理MySQL访问控制系统MySQL 用户创建MySQL 用户密码MySQL 权限授予MySQL 权限撤销MySQL 角色MySQL 删除用户MySQL 表维护mysqldump 备份工具MySQL 数据库列表MySQL 表列表MySQL 表字段列表MySQL 用户列表MySQL 进程列表MySQL 列生成MySQL 表自连接MySQL 恢复

MySQL 全文搜索

MySQL 全文搜索MySQL 全文搜索介绍FULLTEXT索引MySQL 自然语言全文搜索MySQL 布尔全文搜索MySQL查询扩展MySQL ngram

MySQL 高级

MySQL 函数MySQL 窗口函数

MySQL 技巧

MySQL 查找重复数据MySQL 删除重复数据MySQL UUIDMySQL 表的复制MySQL 复制库MySQL 变量MySQL SELECT INTO 变量MySQL 表的存储引擎MySQL 使用正则查询MySQL 添加序号MySQL 随机查询MySQL 查询第 N 高记录MySQL 重置自增值MySQL VS MariaDBMySQL 间隔值MySQL 获取当天日期MySQL NULL 映射MySQL 注释理解MySQL EXPLAINMySQL 技巧介绍MySQL COUNTMySQL 数据分层MySQL 两表比较Mysql Like 优化

MySQL 窗口函数

MySQL CUME_DIST() 函数MySQL DENSE_RANK() 函数MySQL FIRST_VALUE 函数MySQL LAG() 函数MySQL LAST_VALUE() 函数MySQL LEAD 函数MySQL NTH_VALUE 函数MySQL NTILE 函数MySQL PERCENT_RANK 函数MySQL RANK 函数MySQL ROW_NUMBER 函数

MySQL 应用

MySQL应用程序编程接口PHP MySQL教程PHP 数据库连接Python 持久化实现

MySQL 优化

mysqld 内存持续变高求字符串交集


MySQL DATETIME 数据类型


简介:在本教程中,您将了解MySQL DATETIME数据类型以及如何使用一些函数进行有效操作  。

MySQL DATETIME数据类型简介

您使用MySQL DATETIME来存储包含日期时间的值。当您  查询数据从一个DATETIME栏时,MySQL显示DATETIME在下面的格式值:
YYYY-MM-DD HH:MM:SS
默认情况下,DATETIME 值的范围1000-01-01 00:00:009999-12-31 23:59:59DATETIME值使用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个字节用于.9999992015-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个字节。二者TIMESTAMPDATETIME 需要分数秒精度的额外字节。 TIMESTAMP值范围从1970-01-01 00:00:01 UTC2038-01-19 03:14:07 UTC。如果要存储超过2038的时间值,则应使用DATETIME而不是TIMESTAMP。 MySQL TIMESTAMP以UTC值存储。但是,MySQL将DATETIME值存储为没有时区的值。我们来看下面的例子。 首先,将当前连接的时区设置为+00:00
SET time_zone = '+00:00';
接下来,创建一个表命名timestamp_n_datetime是由两列组成:tsdtTIMESTAMPDATETIME使用下面的语句类型。
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)
DATETIMETIMESTAMP列中的值都相同。 最后,将连接的时区设置为+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函数。