You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

日历日期表WeekBegin列表达式咨询(周一为周起始)

解决方案:自定义周起始(周一为始,不跨年)

针对你的Calendar Date表需求,以下是主流工具的实现代码,核心逻辑是先计算常规的周一起始日期,再判断其年份是否与原日期一致,若跨年度则将原日期作为周起始。

SQL 实现(分数据库)

SQL Server

SELECT
    Date,
    -- 计算周起始:若常规周一跨年则取原日期,否则取常规周一
    CASE
        WHEN YEAR(DATEADD(day, -(DATEPART(dw, Date) + 5) % 7, Date)) = YEAR(Date)
        THEN DATEADD(day, -(DATEPART(dw, Date) + 5) % 7, Date)
        ELSE Date
    END AS WeekBegin,
    -- 周结束为周起始加6天
    DATEADD(day, 6, 
        CASE
            WHEN YEAR(DATEADD(day, -(DATEPART(dw, Date) + 5) % 7, Date)) = YEAR(Date)
            THEN DATEADD(day, -(DATEPART(dw, Date) + 5) % 7, Date)
            ELSE Date
        END) AS WeekEnd,
    -- 周天数:跨年周为1天,正常周为7天
    CASE
        WHEN YEAR(DATEADD(day, -(DATEPART(dw, Date) + 5) % 7, Date)) = YEAR(Date)
        THEN 7
        ELSE 1
    END AS DaysinWeek
FROM CalendarDate;

逻辑说明:(DATEPART(dw, Date) + 5) % 7 兼容SQL Server默认周日为一周第一天的设置,计算出当前日期到上周一的偏移量;通过年份判断避免跨年,如2023-01-01(周日)的常规周一为2022-12-26,因跨年直接返回原日期。

MySQL

SELECT
    `Date`,
    CASE
        WHEN YEAR(DATE_SUB(`Date`, INTERVAL WEEKDAY(`Date`) DAY)) = YEAR(`Date`)
        THEN DATE_SUB(`Date`, INTERVAL WEEKDAY(`Date`) DAY)
        ELSE `Date`
    END AS WeekBegin,
    DATE_ADD(
        CASE
            WHEN YEAR(DATE_SUB(`Date`, INTERVAL WEEKDAY(`Date`) DAY)) = YEAR(`Date`)
            THEN DATE_SUB(`Date`, INTERVAL WEEKDAY(`Date`) DAY)
            ELSE `Date`
        END, INTERVAL 6 DAY
    ) AS WeekEnd,
    CASE
        WHEN YEAR(DATE_SUB(`Date`, INTERVAL WEEKDAY(`Date`) DAY)) = YEAR(`Date`)
        THEN 7
        ELSE 1
    END AS DaysinWeek
FROM CalendarDate;

逻辑说明:MySQL的WEEKDAY()函数返回周一为0、周日为6,DATE_SUB减去对应天数得到常规周一;年份判断不满足时返回原日期。

Power Query(M语言)

let
    Source = YourCalendarTable, // 替换为你的日历表数据源
    // 添加周起始列
    AddWeekBegin = Table.AddColumn(Source, "WeekBegin", each 
        let
            RegularWeekBegin = Date.AddDays([Date], -Date.DayOfWeek([Date], Day.Monday)),
            IsSameYear = Date.Year(RegularWeekBegin) = Date.Year([Date])
        in
            if IsSameYear then RegularWeekBegin else [Date]
    ),
    // 添加周结束列
    AddWeekEnd = Table.AddColumn(AddWeekBegin, "WeekEnd", each Date.AddDays([WeekBegin], 6)),
    // 添加周天数列
    AddDaysInWeek = Table.AddColumn(AddWeekEnd, "DaysinWeek", each if [WeekBegin] = [Date] then 1 else 7)
in
    AddDaysInWeek

逻辑说明:Date.DayOfWeek([Date], Day.Monday) 指定周一为一周起始,计算偏移量得到常规周一;通过年份判断处理跨年场景。

DAX(Power BI/Excel)

// 周起始列
WeekBegin = 
VAR RegularMonday = [Date] - WEEKDAY([Date], 2) + 1 // WEEKDAY(,2) 表示周一为1
VAR SameYear = YEAR(RegularMonday) = YEAR([Date])
RETURN IF(SameYear, RegularMonday, [Date])

// 周结束列
WeekEnd = [WeekBegin] + 6

// 周天数列
DaysinWeek = IF([WeekBegin] = [Date], 1, 7)

逻辑说明:WEEKDAY([Date],2) 让周一返回1,计算得到常规周一;年份不匹配时返回原日期,确保周起始不跨年。

内容的提问来源于stack exchange,提问作者KMR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:40:23