内容简介:本文主要介绍MySQL相关知识,包括安装、配置、优化等内容。风哥教程参考MySQL官方文档MySQL SQL Syntax、MySQL Server Administration。
Part01-基础概念与理论知识
1.1 什么是日期时间类型
日期时间类型是MySQL中用于存储日期和时间数据的数据类型。MySQL提供了多种日期时间类型,以满足不同的时间精度和存储需求。
1.2 日期时间类型的分类
- 日期类型:DATE
- 时间类型:TIME
- 日期时间类型:DATETIME, TIMESTAMP
- 年份类型:YEAR
Part02-生产环境规划与建议
2.1 DATE类型的特性
| 类型 | 格式 | 范围 | 存储空间 | 描述 |
|---|---|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01 到 9999-12-31 | 3字节 | 存储日期值 |
2.2 DATE类型的使用
示例:
-- 创建包含DATE类型的表
CREATE TABLE date_test (
id INT AUTO_INCREMENT PRIMARY KEY,
event_date DATE, -- 事件日期
start_date DATE, -- 开始日期
end_date DATE -- 结束日期
);
-- 插入数据
INSERT INTO date_test (event_date, start_date, end_date)
VALUES ('2023-01-01', '2023-01-01', '2023-12-31');
-- 查询数据
SELECT * FROM date_test;
-- 日期计算
SELECT
event_date,
DATE_ADD(event_date, INTERVAL 1 DAY) AS next_day,
DATE_SUB(event_date, INTERVAL 1 MONTH) AS last_month
FROM date_test;
2.3 DATE类型的特点
- 存储格式为YYYY-MM-DD
- 支持日期计算和比较
- 适合存储生日、节假日等日期数据
Part03-生产环境项目实施方案
3.1 TIME类型的特性
| 类型 | 格式 | 范围 | 存储空间 | 描述 |
|---|---|---|---|---|
| TIME | HH:MM:SS | -838:59:59 到 838:59:59 | 3字节 | 存储时间值 |
3.2 TIME类型的使用
示例: 01 更多视频教程www.fgedu.net.cn
-- 创建包含TIME类型的表
CREATE TABLE time_test (
id INT AUTO_INCREMENT PRIMARY KEY,
start_time TIME, -- 开始时间
end_time TIME, -- 结束时间
duration TIME -- 持续时间
);
-- 插入数据
INSERT INTO time_test (start_time, end_time, duration)
VALUES ('09:00:00', '17:30:00', '08:30:00');
-- 查询数据
SELECT * FROM time_test;
-- 时间计算
SELECT
start_time,
end_time,
duration,
ADDTIME(start_time, duration) AS expected_end_time
FROM time_test;
3.3 TIME类型的特点
- 存储格式为HH:MM:SS
- 支持时间计算和比较
- 适合存储时间段、持续时间等时间数据
Part04-生产案例与实战讲解
4.1 DATETIME类型的特性
| 类型 | 格式 | 范围 | 存储空间 | 描述 |
|---|---|---|---|---|
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 到 9999-12-31 23:59:59 | 8字节 | 存储日期和时间值 |
4.2 TIMESTAMP类型的特性
| 类型 | 格式 | 范围 | 存储空间 | 描述 |
|---|---|---|---|---|
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC | 4字节 | 存储日期和时间值,自动更新 |
4.3 日期时间类型的使用
示例:
-- 创建包含日期时间类型的表
CREATE TABLE datetime_test (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at DATETIME, -- 创建时间
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
event_datetime DATETIME -- 事件时间
);
-- 插入数据
INSERT INTO datetime_test (created_at, event_datetime)
VALUES (NOW(), '2023-12-31 23:59:59');
-- 查询数据
SELECT * FROM datetime_test;
-- 等待一段时间后更新数据
UPDATE datetime_test SET event_datetime = '2024-01-01 00:00:00' WHERE id = 1;
-- 再次查询,查看updated_at是否自动更新
SELECT * FROM datetime_test;
4.4 DATETIME与TIMESTAMP的区别
| 特性 | DATETIME | TIMESTAMP |
|---|---|---|
| 范围 | 1000-01-01 到 9999-12-31 | 1970-01-01 到 2038-01-19 |
| 存储空间 | 8字节 | 4字节 |
| 时区 | 不感知时区 | 感知时区 |
| 自动更新 | 需要手动设置 | 可自动更新 |
| 默认值 | 无默认值 | 默认CURRENT_TIMESTAMP |
Part05-风哥经验总结与分享
5.1 YEAR类型的特性
| 类型 | 格式 | 范围 | 存储空间 | 描述 |
|---|---|---|---|---|
| YEAR | YYYY | 1901 到 2155 | 1字节 | 存储年份值 |
5.2 YEAR类型的使用
示例:
-- 创建包含YEAR类型的表
CREATE TABLE year_test (
id INT AUTO_INCREMENT PRIMARY KEY,
year_value YEAR, -- 年份值
release_year YEAR, -- 发布年份
establish_year YEAR -- 成立年份
);
-- 插入数据
INSERT INTO year_test (year_value, release_year, establish_year)
VALUES (2023, 2024, 2000);
-- 查询数据
SELECT * FROM year_test;
5.3 YEAR类型的特点
- 存储格式为YYYY
- 存储空间小,仅1字节
- 适合存储年份数据,如出生年份、发布年份等
6. 日期时间函数
6.1 获取当前日期时间的函数
| 函数 | 描述 | 返回值 |
|---|---|---|
NOW() |
获取当前日期时间 | DATETIME |
CURDATE() |
获取当前日期 | DATE |
CURTIME() |
获取当前时间 | TIME |
SYSDATE() |
获取当前系统日期时间 | DATETIME |
UNIX_TIMESTAMP() |
获取当前Unix时间戳 | INT |
6.2 日期时间计算函数
| 函数 | 描述 | 示例 |
|---|---|---|
DATE_ADD() |
添加日期时间间隔 | DATE_ADD(NOW(), INTERVAL 1 DAY) |
DATE_SUB() |
减去日期时间间隔 | DATE_SUB(NOW(), INTERVAL 1 MONTH) |
ADDTIME() |
添加时间间隔 | ADDTIME(’12:00:00′, ’01:30:00′) |
SUBTIME() |
减去时间间隔 | SUBTIME(’12:00:00′, ’01:30:00′) |
DATEDIFF() |
计算日期差 | DATEDIFF(‘2023-12-31’, ‘2023-01-01’) |
TIMEDIFF() |
计算时间差 | TIMEDIFF(’12:00:00′, ’10:30:00′) |
6.3 日期时间格式化函数
| 函数 | 描述 | 示例 |
|---|---|---|
DATE_FORMAT() |
格式化日期时间 | DATE_FORMAT(NOW(), ‘%Y-%m-%d %H:%i:%s’) |
STR_TO_DATE() |
字符串转日期时间 | STR_TO_DATE(‘2023-01-01’, ‘%Y-%m-%d’) |
6.4 日期时间函数的使用
示例: 02 学习交流加群风哥微信: itpux-com
-- 使用日期时间函数
SELECT
NOW() AS current_datetime,
CURDATE() AS current_date,
CURTIME() AS current_time,
UNIX_TIMESTAMP() AS unix_timestamp,
DATE_ADD(NOW(), INTERVAL 7 DAY) AS next_week,
DATE_SUB(NOW(), INTERVAL 1 MONTH) AS last_month,
DATEDIFF('2023-12-31', '2023-01-01') AS days_in_year,
DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时%i分%s秒') AS formatted_datetime;
7. 日期时间类型的最佳实践
7.1 选择合适的日期时间类型
- 只需要日期:使用DATE类型
- 只需要时间:使用TIME类型
- 需要日期和时间,且范围较大:使用DATETIME类型
- 需要日期和时间,且需要自动更新:使用TIMESTAMP类型
- 只需要年份:使用YEAR类型
7.2 日期时间类型的索引
- 对于经常查询的日期时间列,创建索引可以提高查询性能
- 对于范围查询,如查询某一时间段的数据,索引可以显著提高性能
- 避免在日期时间列上使用函数,会导致索引失效
7.3 日期时间类型的存储
- 使用标准的日期时间格式
- 对于需要时区支持的场景,使用TIMESTAMP类型
- 对于不需要时区支持的场景,使用DATETIME类型
7.4 日期时间类型的默认值
- 对于创建时间,使用CURRENT_TIMESTAMP作为默认值
- 对于更新时间,使用CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
8. 常见错误与解决方案
8.1 日期时间格式错误
问题:插入的日期时间格式不正确
解决方案:使用标准的日期时间格式,如YYYY-MM-DD HH:MM:SS 03 学习交流加群风哥QQ113257174
8.2 TIMESTAMP范围限制
问题:插入的时间超出了TIMESTAMP的范围
解决方案:对于超出1970-2038范围的时间,使用DATETIME类型
8.3 时区问题
问题:不同时区的时间显示不一致
解决方案:统一设置时区,或使用TIMESTAMP类型 04 风哥提示:
8.4 索引失效
问题:日期时间列上的索引失效
解决方案:避免在日期时间列上使用函数,或使用函数索引
9. 示例:综合使用日期时间类型
示例:订单表设计 05更多学习教程公众号风哥教程itpux_com
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
order_date DATETIME NOT NULL,
ship_date DATE,
payment_time TIME,
status ENUM('待付款', '待发货', '已发货', '已完成', '已取消'),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 插入订单数据
INSERT INTO orders (user_id, order_date, ship_date, payment_time, status)
VALUES (1, NOW(), DATE_ADD(CURDATE(), INTERVAL 2 DAY), '14:30:00', '待发货');
-- 查询订单
SELECT * FROM orders;
-- 查询今天的订单
SELECT * FROM orders WHERE DATE(order_date) = CURDATE();
-- 查询最近7天的订单
SELECT * FROM orders WHERE order_date >= DATE_SUB(NOW(), INTERVAL 7 DAY);
示例:用户表设计
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
birth_date DATE, -- 出生日期
join_year YEAR, -- 加入年份
last_login DATETIME, -- 最后登录时间
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 插入用户数据
INSERT INTO users (username, birth_date, join_year, last_login)
VALUES ('admin', '1990-01-01', 2020, NOW());
-- 查询用户
SELECT * FROM users;
-- 查询年龄大于30岁的用户
SELECT * FROM users WHERE YEAR(CURDATE()) - YEAR(birth_date) > 30;
10. 总结
本教程详细介绍了MySQL的日期时间类型,包括:
- 日期类型:DATE
- 时间类型:TIME
- 日期时间类型:DATETIME, TIMESTAMP
- 年份类型:YEAR
- 日期时间函数
- 日期时间类型的最佳实践
- 常见错误与解决方案
选择合适的日期时间类型对于数据库的性能、存储效率和数据完整性都非常重要。在实际项目中,应根据具体的业务需求和数据特点,选择最适合的日期时间类型。对于只需要日期的数据,应使用DATE类型;对于只需要时间的数据,应使用TIME类型;对于需要日期和时间的数据,应根据范围和是否需要自动更新选择DATETIME或TIMESTAMP类型;对于只需要年份的数据,应使用YEAR类型。
提示:在设计表结构时,应仔细考虑每个日期时间字段的需求,选择合适的日期时间类型,并合理使用日期时间函数,以提高数据库的性能和存储效率。 06 from mysql视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
