我的查询结果是把星期弄错了.我有一张简单的桌子:

CREATE TABLE `test` (
  `id` int(10) NOT NULL,
  `p_date` datetime DEFAULT NULL,
  `amount` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `test` (`id`, `p_date`, `amount`) VALUES
(4, '2024-01-02 13:15:38', 150);

我try 用下面的查询捕捉表中的帖子:

SELECT 
amount,
date_format(p_date, '%u') as week, 
date_format(p_date, '%Y') as year
FROM test
WHERE week(p_date) = 1
AND year(p_date) = 2024

这将返回空.但是,如果我将Week更改为0,它将获取POST.但是日期2024-01-02在第一周.那么,当我在第一周运行查询时,为什么没有获取POST呢?

演示:https://dbfiddle.uk/tIzywRY4

I MariaDB 10.4.22

推荐答案

根据documentation,默认情况下,week函数从0开始计算周数.

日期2024-01-02在一年中的第一周,因此该函数将返回0作为该日期的周编号.

您可以通过设置函数的mode参数来改变这一点.我将从文档中复制可用于此选项的值表及其表示的内容:

Mode 1st day of week Range Week 1 is the 1st week with
0 Sunday 0-53 a Sunday in this year
1 Monday 0-53 more than 3 days this year
2 Sunday 1-53 a Sunday in this year
3 Monday 1-53 more than 3 days this year
4 Sunday 0-53 more than 3 days this year
5 Monday 0-53 a Monday in this year
6 Sunday 1-53 more than 3 days this year
7 Monday 1-53 a Monday in this year

因此,要获得预期的结果,您可以使用模式3,例如

SELECT 
  amount,
  date_format(p_date, '%u') as week, 
  date_format(p_date, '%Y') as year
FROM 
  test
WHERE 
  week(p_date, 3) = 1
  AND year(p_date) = 2024

演示:https://dbfiddle.uk/5KZmU18G

Sql相关问答推荐

帮助修复查询以识别SQL DW中数据中的递归关系

R中对Arrow duckdb工作流的SQL查询

Access 365将文本转换回BigInt

将主表与历史表连接以获取主表的当前汇率以及历史表中的上一个和最后一个汇率

UPDATE查询中的乐观锁

返回找到的最小和最大row_number()spark SQL

对列进行排序后,基于两列删除重复行

了解多个分组集

在PostgreSQL中汇总连接表中的 case 值

将JSON文件导入Postgres 16数据库时出错(22P04上次预期列之后的额外数据)

SQL根据另一列的顺序和值获取组中的最后一列

在 SQL Server 中合并两个 XML 列

Postgres,使用 select 插入多个值

如何用SQL组合客户拥有的产品

在 Oracle 21c 中透视文本值

PostgreSQL - 递归地聚合来自不同列的属性

函数调用作为插入值语句中的参数

计算 SQL 中的总体成功率:递归 CTE 还是替代方法?

SQLite 中的过滤运行总和视图

从 Pyspark 转换为具有多个分组条件的语句时的情况