Sql server 需要函数给出一周中第一天的日期时间,给出一周中第一天的天数

Sql server 需要函数给出一周中第一天的日期时间,给出一周中第一天的天数,sql-server,Sql Server,对许多人来说,工作周的第一天是星期一,但让我们说它是不同的一天,比如说星期三 您是否可以帮助我创建一个函数(SQL Server 2012),该函数返回中第一天的日期: 本周 下周 上周 我们给出了一个日期,类型(Current,Next,Last),FirstDay(0,1,2,3,4,5,6),并根据类型返回当前的第一天或一周的下一天或最后一天的datetime 创建函数[dbo]。[GetStartofWeek] ( @第一天, @VARCHAR型(10), @日期时间 ) 返回日期 作为

对许多人来说,工作周的第一天是星期一,但让我们说它是不同的一天,比如说星期三

您是否可以帮助我创建一个函数(SQL Server 2012),该函数返回中第一天的日期:

  • 本周
  • 下周
  • 上周
  • 我们给出了一个日期,类型(Current,Next,Last),FirstDay(0,1,2,3,4,5,6),并根据类型返回当前的第一天或一周的下一天或最后一天的datetime

    创建函数[dbo]。[GetStartofWeek] (
    @第一天, @VARCHAR型(10), @日期时间 ) 返回日期 作为 开始


    谢谢

    我相信这会告诉你你想要的日期:

    create function [dbo].[GetStartofWeek] 
    (
        @firstDay int, 
        @type varchar(10), 
        @day date
    ) 
    returns date as
    begin
    
    -- use datediff/dateadd to get the date of sunday for the week of the given @day (-1 casts as Sunday 1899-12-31)
    declare @sundayOfWeek date = dateadd(week, datediff(week, -1, @day), -1)
    
    -- @firstDay is 0 to 6, 0 representing Sunday
    declare @firstDayOfWeek date = dateadd(day, @firstDay, @sundayOfWeek)
    
    -- add or subtract a week if necessary
    set @type = upper(@type)
    
    if @type = 'LAST'
        set @firstDayOfWeek = dateadd(week, -1, @firstDayOfWeek)
    else if @type = 'NEXT'
        set @firstDayOfWeek = dateadd(week, 1, @firstDayOfWeek)
    
    return @firstDayOfWeek
    end
    go
    
    使用以下输入进行测试:

    select [dbo].[GetStartofWeek](0, 'Last',    '2014-12-14')   -- 2014-12-07   
    select [dbo].[GetStartofWeek](3, 'Last',    '2014-12-14')   -- 2014-12-10   
    select [dbo].[GetStartofWeek](6, 'Last',    '2014-12-14')   -- 2014-12-13   
    select [dbo].[GetStartofWeek](0, 'Current', '2014-12-17')   -- 2014-12-14   
    select [dbo].[GetStartofWeek](3, 'Current', '2014-12-17')   -- 2014-12-17
    select [dbo].[GetStartofWeek](6, 'Current', '2014-12-17')   -- 2014-12-20
    select [dbo].[GetStartofWeek](0, 'Next',    '2014-12-20')   -- 2014-12-21
    select [dbo].[GetStartofWeek](3, 'Next',    '2014-12-20')   -- 2014-12-24
    select [dbo].[GetStartofWeek](6, 'Next',    '2014-12-20')   -- 2014-12-27
    
    一个建议是使用一周补偿,而不是“上一周”/“当前期”/“下一周”,这更干净、更灵活:

    alter function [dbo].[GetStartofWeek] 
    (
        @firstDay int, 
        @weekOffset int, 
        @day date
    ) 
    returns date as
    begin
    
    -- use datediff/dateadd to get the date of sunday for the week of the given @day (-1 casts as Sunday 1899-12-31)
    declare @sundayOfWeek date = dateadd(week, datediff(week, -1, @day), -1)
    
    -- @firstDay is 0 to 6, 0 representing Sunday
    declare @firstDayOfWeek date = dateadd(day, @firstDay, @sundayOfWeek)
    
    -- add or subtract weeks if necessary
    if @weekOffset <> 0
    begin
        set @firstDayOfWeek = dateadd(week, @weekOffset, @firstDayOfWeek)
    end
    
    return @firstDayOfWeek
    end
    go
    
    alter函数[dbo].[GetStartofWeek]
    (
    @第一天,
    @weekOffset int,
    @日期
    ) 
    返回日期为
    开始
    --使用datediff/dateadd获取给定@天的一周的星期日日期(-1铸造为星期日1899-12-31)
    声明@sundayOfWeek date=dateadd(周,日期差(周,-1,@day),-1)
    --@第一天是0到6,0代表星期天
    声明@firstDayOfWeek日期=dateadd(天、@firstDay、@sundayOfWeek)
    --如有必要,增加或减少周数
    如果@weekOffset 0
    开始
    设置@firstDayOfWeek=dateadd(周、@weekOffset、@firstDayOfWeek)
    结束
    返回@firstDayOfWeek
    结束
    去
    
    你能告诉我们到目前为止你都做了些什么吗?1900日期系统的行为是,
    MOD(,7)
    等于周日为零的工作日。如果您希望星期三为零,请将4添加到
    MOD
    直到SQL 2014年才推出,但可以通过
    SELECT CONVERT(int,getdate())-7*(CONVERT(int,getdate())/7)轻松模仿。你剩下的问题就是加减法。