MariaDB WEEK() 函数的基础用法与实例

MariaDB WEEK() 函数用来计算指定日期是当年的第几周。

发布于

MariaDB WEEK() 函数用来计算指定日期是当年的第几周。它通常与日期相关的操作和统计有关,比如根据日期进行分组、排序等。

语法

MairaDB WEEK() 函数的语法如下:

WEEK(date, mode)
  • date: 要计算周数的日期值,可以是 DATE、DATETIME 或 TIMESTAMP 类型。
  • mode: 一个模式值,用于决定一周的开始日期(周日或周一)以及如何计算跨年的周数。该参数是可选的,如果不提供则使用默认值 0。

不同的 mode 值的含义如下:

Mode 值 一周的开始日期 年中第一周的定义
0 周日 最小包含该年第一个星期四的周
1 周一 最小包含该年 1 月 1 号的周
2 周日 最小包含该年第一个星期日的周
3 周一 最小包含该年第一个星期一的周
4 周日 最小包含该年 1 月 1 号的周(与 1 效果相同)
5 周一 最小包含该年最后一个星期四的周(与 3 相似)
6 周日 最小包含该年第一个星期二的周
7 周一 最小包含该年第一个星期日的周(与 0 相同)

函数返回值是一个介于 0 到 53 之间的整数,表示该日期所在的周数。

实例

获取指定日期的周数

本实例展示如何使用 WEEK() 函数获取指定日期的周数。

SELECT WEEK('2023-05-15') AS 周数;

以下是该语句的输出:

+------+
| 周数 |
+------+
|   20 |
+------+

输出结果显示 2023-05-15 这个日期是 2023 年的第 20 周。

使用不同 mode 获取周数

本实例展示使用不同的 mode 参数如何影响周数的计算。

SELECT
    WEEK('2023-01-01', 0) AS '周日起始周(mode=0)',
    WEEK('2023-01-01', 1) AS '周一起始周(mode=1)',
    WEEK('2023-01-01', 3) AS '周一起始新年第一周(mode=3)';

以下是该语句的输出:

+--------------------+--------------------+----------------------------+
| 周日起始周(mode=0) | 周一起始周(mode=1) | 周一起始新年第一周(mode=3) |
+--------------------+--------------------+----------------------------+
|                  1 |                  0 |                         52 |
+--------------------+--------------------+----------------------------+

将日期转换为年份和周数格式

本实例展示如何将日期转换为 “年份-周数” 的格式。

DROP TABLE IF EXISTS mytable;
CREATE TABLE mytable (dt DATE);
INSERT INTO mytable VALUES ('2023-05-01'), ('2024-01-01'), ('2022-12-31');

SELECT DATE_FORMAT(dt, '%X-%V') AS 年份周数
FROM mytable;

以下是该语句的输出:

+----------+
| 年份周数 |
+----------+
| 2023-18  |
| 2023-53  |
| 2022-52  |
+----------+

通过使用 DATE_FORMAT() 函数并将格式化模式设置为 %X-%V,其中 %X 表示年份的最后两位数字,%V 表示该年的周数,从而实现将日期转换为 “年份-周数” 格式的输出。

按周数分组统计记录数

本实例展示如何使用 WEEK() 函数按周数对记录进行分组统计。

DROP TABLE IF EXISTS orders;
CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at DATETIME
);

INSERT INTO orders (created_at) VALUES
    ('2023-05-01 10:00:00'),
    ('2023-05-03 14:30:00'),
    ('2023-05-08 09:15:00'),
    ('2023-05-15 16:45:00'),
    ('2023-05-22 11:20:00');

SELECT WEEK(created_at) AS 周数, COUNT(*) AS 订单数
FROM orders
GROUP BY WEEK(created_at)
ORDER BY 周数;

以下是该语句的输出:

+------+--------+
| 周数 | 订单数 |
+------+--------+
|   18 |      2 |
|   19 |      1 |
|   20 |      1 |
|   21 |      1 |
+------+--------+

通过对 orders 表中的 created_at 字段应用 WEEK() 函数并按周数进行分组统计,可以方便地获取每一周的订单数量。结果显示第 18 周有 2 个订单,第 19、20、21 周各有 1 个订单。

获取指定年份的第一周和最后一周

本实例展示如何获取指定年份的第一周和最后一周的日期范围。

SELECT
    CONCAT(YEAR(NOW()), '-01-01') AS 本年第一天,
    CONCAT(YEAR(NOW()), '-12-31') AS 本年最后一天,
    WEEK(CONCAT(YEAR(NOW()), '-01-01'), 0) AS 第一周,
    WEEK(CONCAT(YEAR(NOW()), '-12-31'), 0) AS 最后一周;

以下是该语句的输出:

+------------+--------------+--------+----------+
| 本年第一天 | 本年最后一天 | 第一周 | 最后一周 |
+------------+--------------+--------+----------+
| 2024-01-01 | 2024-12-31   |      0 |       52 |
+------------+--------------+--------+----------+

首先使用 YEAR(NOW()) 获取当前年份,并与 01-0112-31 拼接得到本年的第一天和最后一天的日期。然后将这两个日期传递给 WEEK() 函数并设置 mode=0,从而获取本年第一周和最后一周的周数。

结果显示,2023 年的第一周是从 2023-01-01 开始的那一周,最后一周是 2023 年的第 52 周。

相关函数

以下是几个与 MairaDB WEEK() 相关的几个函数:

  • MariaDB MONTH() 函数用来获取指定日期的月份值。
  • MariaDB YEAR() 函数用来获取指定日期的年份值。
  • MariaDB DAYOFWEEK() 函数用来获取指定日期是一周中的第几天。
  • MariaDB DAYOFYEAR() 函数用来获取指定日期是一年中的第几天。
  • MariaDB WEEKDAY() 函数用来获取指定日期是一周中的星期几(0 表示周一,6 表示周日)。

结论

MariaDB WEEK() 函数是处理日期和时间相关操作时的一个非常有用的函数。它可以根据指定的 mode 模式,以不同的方式计算一个日期所处的周数。通过本文的实例,我们学习了如何使用 WEEK() 函数获取指定日期的周数、使用不同 mode 值的效果、将日期转换为年份和周数格式、按周数分组统计记录数以及获取指定年份的第一周和最后一周等操作。掌握了 WEEK() 函数的用法,将有助于我们更好地处理与日期和时间相关的问题。