按每周一分组数据未按预期工作

Posted

技术标签:

【中文标题】按每周一分组数据未按预期工作【英文标题】:Grouping data by Each Monday not working as intended 【发布时间】:2020-07-17 16:23:11 【问题描述】:

目标:

我正在尝试按周聚合数据,其中开始日期为星期一,结束日期为星期日。

预期结果:

+----------+-----------+----------+
|   Date   |   Name    | WeekDate |
+----------+-----------+----------+
| 1/1/2018 | Monday    | 1/1/2018 |
| 1/2/2018 | Tuesday   | 1/1/2018 |
| 1/3/2018 | Wednesday | 1/1/2018 |
| 1/4/2018 | Thursday  | 1/1/2018 |
| 1/5/2018 | Friday    | 1/1/2018 |
| 1/6/2018 | Saturday  | 1/1/2018 |
| 1/7/2018 | Sunday    | 1/1/2018 |
| 1/8/2018 | Monday    | 1/8/2018 |
+----------+-----------+----------+

实际发生的情况:

+------------+------------+
|    date    |  WeekDate  |
+------------+------------+
| 2018-01-01 | 2018-01-01 |
| 2018-01-02 | 2018-01-01 |
| 2018-01-03 | 2018-01-01 |
| 2018-01-04 | 2018-01-01 |
| 2018-01-05 | 2018-01-01 |
| 2018-01-06 | 2018-01-01 |
| 2018-01-07 | 2018-01-08 |
| 2018-01-08 | 2018-01-08 |
+------------+------------+

代码:

    select 
         cast(dateadd(week,DATEDIFF(week,0, [date]),0) as date) AS Date
        ,count(user_id) AS count
    from ##data

为什么应该在 2018-01-01 的时候将 1 月 7 日放到 2018-01-08 组中。

【问题讨论】:

减去一天然后加回来会起作用:dateadd(day, 1, cast(dateadd(week,DATEDIFF(week,0, dateadd(day, -1,[date])),0) as date)) 你的不起作用的原因是,虽然它折叠成几周,但它仍然依赖于一周是周日到周六的定义。当您覆盖您想要的任何一周时,您会看到它跨越两个不同的“datediff”周。 @shawnt00 谢谢!但后来我尝试将 DATEFIRST 更改为 1 但它没有做任何事情...... 对。但是你们查看datediff 上的文档,它说datefirst 不会改变其行为以使其保持确定性功能。 【参考方案1】:

我会推荐以下日期算法:

set datefirst 1;
select 
     d.*,
     dateadd(day, 1 - datepart(weekday, [date]), [date]) AS first_day_of_week,                     from ##data d;

第一条指令将星期一定义为一周的第一天。然后,date_part() 会为您提供一个代表星期几的数字,您可以使用该数字将日期偏移到前一个星期一。

【讨论】:

完美,但出于好奇,您对我的代码为什么没有按预期工作有任何解释吗?【参考方案2】:

您可以使用 ISO_WEEK 每周对数据进行分组,如下所示。 您可以查看 ISO_WEEK 如何解释您的数据Here

select *, datepart(ISO_WEEK,Date) WeekNumber
from your_table

对于您所需的确切输出,您可以尝试以下逻辑-

Demo Here

select *, 
DATEADD(
    DD,
    -
    CASE 
        WHEN datepart(weekday,date) = 1 THEN 7 
        ELSE datepart(weekday,date) - 1
    END + 1,
    DATE
)
from your_table

【讨论】:

以上是关于按每周一分组数据未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

NumberFormatter 分组未按预期工作

Vue计算属性未按预期工作[关闭]

MySQL 按时间戳分组/排序不能按预期工作

在兄弟组件之间共享数据(未按预期工作)

All 子句核心数据谓词未按预期工作

QDataStream 未按预期工作