MSSQL-从范围内的int查找日期(函数?)

MSSQL-从范围内的int查找日期(函数?),sql,function,sql-server-2008-r2,range,weekday,Sql,Function,Sql Server 2008 R2,Range,Weekday,信息:MS SQL Server 2008 R2 你好。我试图创建一个有两个参数输入和一个输出的函数。这两个输入是一周中的一天INT@dowin从周一开始为1,aDATETIME@datein. 该函数的目的是通过查看从@datein创建的周范围,并使用周内日期INT@dowin从该范围中选取一个新的日期时间,从而确定@newdate的新日期时间输出 原因:约会计划程序使用的是开始日期,如果约会再次出现,它会创建一周中从开始日期开始重新出现的一天。我正在从一个表视图创建一个SSRS报告,我需要每

信息:MS SQL Server 2008 R2

你好。我试图创建一个有两个参数输入和一个输出的函数。这两个输入是一周中的一天INT@dowin从周一开始为1,aDATETIME@datein. 该函数的目的是通过查看从@datein创建的周范围,并使用周内日期INT@dowin从该范围中选取一个新的日期时间,从而确定@newdate的新日期时间输出

原因:约会计划程序使用的是开始日期,如果约会再次出现,它会创建一周中从开始日期开始重新出现的一天。我正在从一个表视图创建一个SSRS报告,我需要每个约会发生的一个实例

以下是我到目前为止的函数脚本:

    CREATE FUNCTION UFsurgopsched(@datein DATETIME,@dowin int)
    RETURNS datetime
    AS
    BEGIN
        DECLARE @newdate datetime
        DECLARE @startOfWeek date
        DECLARE @endOfWeek date
    SELECT @newdate = datepart(dw,@dowin) as date in
        (
        SELECT
        convert(date, dateadd(dd, -1*(datepart(dw, @datein)-2), @datein)) AS @startOfWeek,
        convert(date, dateadd(dd, 7-(datepart(dw, @datein)-1), @datein)) AS @endOfWeek
        )
    RETURN @newdate
    END
我想要得到的是: -@dowin=3 -@datein=2014-02-11 07:30:00.000 -@datein的范围应为:2014-02-10至2014-02-16 在该范围内,根据@dowin的@newdate将为2014-02-12 07:30:00.000

**编辑*** 在大家的帮助下,我用一个简单得多的函数解决了这个问题:


我不完全确定我是否理解您的标准,但根据您的示例,这将返回所需的结果:

        DECLARE @newdate datetime
        DECLARE @startOfWeek datetime
        DECLARE @endOfWeek datetime
        declare @datein DATETIME
        declare @dowin int


  set @dowin = 3
  set @datein = '2014-02-11 07:30:00.000'
/* -- Don't think you need any of this
SELECT @newdate = datepart(dw,@dowin) as date in
        (
        SELECT
        convert(date, dateadd(dd, -1*(datepart(dw, @datein)-2), @datein)) AS @startOfWeek,
        convert(date, dateadd(dd, 7-(datepart(dw, @datein)-1), @datein)) AS @endOfWeek
        )
*/
select
dateadd(dd,@dowin, convert(datetime, dateadd(dd, -1*(datepart(dw, @datein)-2), @datein)))
我只是用你的逻辑计算一周的开始时间,把@dowin parm加进去。

试试这个


希望这能奏效

你能具体告诉我们你想得到什么吗?到目前为止,您对所开发的内容有什么特别的问题吗?@Andrew请参阅底部的更新。@Andrew,我没有将您标记为正确答案,因为结果不一致。我可以用一个简单得多的方法来解决这个问题。更新的问题。我有点担心,但你们的要求很模糊。不管怎么说,很高兴你解决了。太棒了。这正是我思考的错误方向。我试图在一个范围内精确定位dw,而我本应该修改原始值。血淋淋的辉煌和作品像一个魅力。非常感谢。这是一个伟大的解决方案!非常感谢。
        DECLARE @newdate datetime
        DECLARE @startOfWeek datetime
        DECLARE @endOfWeek datetime
        declare @datein DATETIME
        declare @dowin int


  set @dowin = 3
  set @datein = '2014-02-11 07:30:00.000'
/* -- Don't think you need any of this
SELECT @newdate = datepart(dw,@dowin) as date in
        (
        SELECT
        convert(date, dateadd(dd, -1*(datepart(dw, @datein)-2), @datein)) AS @startOfWeek,
        convert(date, dateadd(dd, 7-(datepart(dw, @datein)-1), @datein)) AS @endOfWeek
        )
*/
select
dateadd(dd,@dowin, convert(datetime, dateadd(dd, -1*(datepart(dw, @datein)-2), @datein)))
    CREATE FUNCTION UFsurgopsched(@datein DATETIME,@dowin int)
    RETURNS datetime
    as begin

    declare @dowinf int 
    DECLARE @newdate datetime
    if (@dowin)= 7 begin set @dowinf =1 end else set @dowinf =@dowin+1
            DECLARE @startOfWeek int = Datepart(DW,@datein)
    if @startOfWeek<@dowinf set @newdate = dateadd(day,@dowinf-@startOfWeek,@datein) else if @startOfWeek>@dowinf set @newdate = dateadd(day,7-(@startOfWeek-@dowinf),@datein) else set @newdate = dateadd(day,7,@datein) 
    return @newdate
    end

--------------Will return the next date from @datein where week day number @dowin matches

---------------For Example if insert 20140213 and weekday as 1

---------------will return the date of next Monday from the entered date