1. 首页 > MySQL教程 > 正文

MySQL教程FG068-MySQL日期时间类型详解

GF-MySQL

内容简介:本文主要介绍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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息