【问题标题】:Add week in a table within SQL Server在 SQL Server 中的表中添加星期
【发布时间】:2020-02-06 09:34:01
【问题描述】:

我希望将计算列添加到包含日期的表中

select datepart(wk, '01-01-2020')
1

select datepart(wk, '12-29-2019')
53----result wanted 52

【问题讨论】:

    标签: sql-server tsql sql-server-2016


    【解决方案1】:

    试试ISO_WEEK:

    select datepart(iso_week,'01-01-2020')
    
    select datepart(iso_week,'12-29-2019')
    

    来自文档:

    ISO 8601 包括 ISO 星期日期系统,这是一个编号系统 周。每周与星期四发生的年份相关联。 例如,2004 年第 1 周 (2004W01) 涵盖 2003 年 12 月 29 日星期一 至 2004 年 1 月 4 日星期日。欧洲国家/地区通常使用 这种编号方式。非欧洲国家/地区通常这样做 不要使用它。

    注意:一年中最高的周数可能是 52 或 53。

    你也可以和SET DATEFIRST一起玩:

    SET DATEFIRST 1
    
    SELECT @@DATEFIRST
    
    select datepart(week,'01-01-2020') -- 1
    
    select datepart(week,'12-29-2019') -- 52
    
    select datepart(week,'12-30-2019') -- 53
    

    如果您无法在insert/update 上填充此值并且您不确定谁将对表执行操作,您可以创建如下触发器:

    CREATE TABLE [dbo].[X]
    (
        [ID] INT IDENTITY(1,1)
       ,[Date] DATETIME2
       ,[Week] TINYINT
    );
    
    GO
    
    CREATE TRIGGER [T] ON [dbo].[X] AFTER INSERT, UPDATE
    AS
    BEGIN
    
        SET DATEFIRST 1;
    
        UPDATE [dbo].[X]
        SET [Week] = DATEPART(WEEK,A.[Date])
        FROM [dbo].[X] A
        INNER JOIN inserted B
            ON A.[ID] = B.[ID]
    
    END;
    
    GO
    
    INSERT INTO [dbo].[X] ([Date])
    VALUES ('01-01-2020')
          ,('12-29-2019')
          ,('12-30-2019');
    
    SELECT *
    FROM [dbo].[X];
    

    【讨论】:

    • select datepart(iso_week,'12-30-2019') 我会得到 1,我需要 53。
    • @csharp 这个怎么样?
    • 是的!看起来很棒!但是如何在计算列中设置@@DATEFIRST?
    • 这会很棘手。考虑用触发器填充此列?
    • 我不知道触发器。我是 sql 中的新手
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2012-01-28
    • 2019-10-31
    相关资源
    最近更新 更多