引言

在数据库管理和开发中,日期查询是一项基础且频繁使用的功能。MySQL提供了丰富的日期和时间处理函数,使得我们能够灵活地进行日期查询和数据处理。本文将详细介绍MySQL中关于日期查询的几个重要知识点,并附上具体的案例。

1. MySQL的日期时间类型

MySQL支持多种日期时间类型,主要包括 DATETIME、TIMESTAMP、DATE、TIME、YEAR 等。每种类型都有其特定的应用场景和存储格式。

  • DATETIME:占用8字节,格式为YYYY-MM-DD HH:MM:SS,日期范围从1000-01-01 00:00:00到9999-12-31 23:59:59。
  • TIMESTAMP:占用4字节,格式为YYYY-MM-DD HH:MM:SS,但范围较小,从1970-01-01 00:00:01 UTC到2038年某个时间点。
  • DATE:占用3字节,格式为YYYY-MM-DD,范围从1000-01-01到9999-12-31。
  • TIME:表示时间(或持续时间),格式为HH:MM:SS。
  • YEAR:仅表示年份,格式为YYYY。
  • MONTH(): 函数用于从日期中提取月份值,返回一个1到12之间的整数,表示月份。

使用案例

CREATE TABLE orders (  
    id INT AUTO_INCREMENT PRIMARY KEY,  
    order_date DATETIME,  
    order_amount DECIMAL(10, 2)  
);  
  
INSERT INTO orders (order_date, order_amount) VALUES ('2023-01-01 12:00:00', 100.00);

2. 日期和时间函数

MySQL提供了大量的日期和时间函数,用于进行日期和时间的计算和格式化。

  • CURDATE() 和 CURRENT_DATE:返回当前系统的日期值。
  • CURTIME() 和 CURRENT_TIME:返回当前系统的时间值。
  • NOW() 和 SYSDATE():返回当前系统的日期和时间值。
  • UNIX_TIMESTAMP():返回UNIX时间戳。
  • FROM_UNIXTIME():将UNIX时间戳转换为日期时间格式。
  • DATE_ADD() 和 ADDDATE():向日期添加指定的时间间隔。
  • DATE_SUB() 和 SUBDATE():从日期减去指定的时间间隔。
  • DATEDIFF():计算两个日期之间的天数差。
  • DATE_FORMAT():将日期格式化为指定的字符串格式。

使用案例

查询今天的所有订单:

SELECT * FROM orders WHERE DATE(order_date) = CURDATE();

查询过去7天内的订单:

SELECT * FROM orders WHERE order_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE();

DATE_FORMAT() 日期格式化

  1. 查询订单,并将订单日期格式化为“年-月-日”的格式:
SELECT   
    DATE_FORMAT(order_date, '%Y-%m-%d') AS formatted_order_date
FROM  orders;
  1. 获取当前日期并转换为’%Y%m%dT%H%i%s’,例如 2023-09-14 00:00:00
DATE_FORMAT(CURDATE(), '%Y-%m-%d %H:%i:%s')
  1. 获取当前日期并转换为 20230921T000000 格式
DATE_FORMAT(CURDATE(), ''%Y%m%dT%H%i%s'')
  1. 获取当前日期前一周的时间并转换为 ‘%Y%m%dT%H%i%s’ 格式
DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 7 DAY), '%Y-%m-%d %H:%i:%s') 

3. 按日期范围查询

在实际应用中,经常需要查询某个日期范围内的数据。这可以通过BETWEEN操作符或者比较操作符(>、<等)来实现。

案例
查询2023年1月份的所有订单:

SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';

或者,使用YEAR()和MONTH()函数:

SELECT * FROM orders WHERE YEAR(order_date) = 2023 AND MONTH(order_date) = 1;

4. 特殊日期查询

MySQL还支持查询特定日期,如今天、昨天、本周、本月等的数据。

案例
查询昨天的订单:

SELECT * FROM orders WHERE order_date = DATE_SUB(CURDATE(), INTERVAL 1 DAY);

或者:

SELECT * FROM orders WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND order_date < CURDATE();

查询本月的订单:

SELECT * FROM orders WHERE YEAR(order_date) = YEAR(CURDATE()) AND MONTH(order_date) = MONTH(CURDATE());

或者使用DATE_FORMAT函数:

SELECT * FROM orders WHERE DATE_FORMAT(order_date, '%Y%m') = DATE_FORMAT(CURDATE(), '%Y%m');

5. 时间和时间戳的转换

在处理数据库时,经常需要将时间和时间戳进行转换。MySQL提供了FROM_UNIXTIME()和UNIX_TIMESTAMP()函数来完成这一任务。

案例
将时间戳转换为日期时间格式:

SELECT FROM_UNIXTIME(1672531200);

将日期时间转换为UNIX时间戳:

SELECT UNIX_TIMESTAMP('2023-01-01 12:00:00');

6. 实战案例-生成特定时间范围内的日期列表

MySQL 8.0引入了递归的公用表表达式(CTE),这使得生成日期序列变得更加容易和灵活。

以下 SQL 将生成 ‘2023-01-01’~‘2023-01-10’ 的日期列表:

WITH RECURSIVE date_series AS (  
  SELECT '2023-01-01' AS date  
  UNION ALL  
  SELECT DATE_ADD(date, INTERVAL 1 DAY)  
  FROM date_series  
  WHERE date < '2023-01-10'  
)  
SELECT * FROM date_series;

结语

通过本文,我们详细了解了MySQL中关于日期查询的多个知识点,包括日期时间类型、日期和时间函数、按日期范围查询、特殊日期查询以及时间和时间戳的转换。希望这些内容能够帮助你在实际开发中更好地处理日期相关的数据。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部