1

信息:MS SQL Server 2008 R2

你好。我正在尝试创建一个具有两个参数输入和一个输出的函数。这两个输入是从星期一开始的 INT(@dowin) 和一个 DATETIME(@datein) 的星期几。该函数的目的是通过查看从 (@datein) 创建的周范围并使用星期几 INT (@dowin) 从该范围中选择新的 DATETIME 来确定新的 DATETIME 输出 (@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 在该范围内@newdate 根据@dowin 将是 2014-02-12 07:30:00.000

**编辑* ** 在大家的帮助下,我能够用一个更简单的功能解决:


    CREATE FUNCTION [dbo].[UFsurgopsched](@datein DATETIME,@dowin int)
    RETURNS DATETIME
    AS
    BEGIN
    DECLARE @newdate DATETIME
        DECLARE @dateweek DATETIME
        SET
            @dateweek =
                convert(datetime, dateadd(dd, -1*(datepart(dw, @datein)-2), @datein))
        SELECT
            @newdate =
                dateadd(DD ,@dowin - 1, @dateweek)
        RETURN
            @newdate
    END
4

2 回答 2

0

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

        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)))

SQL小提琴

我只是使用您的逻辑(只是将其设为日期时间)计算您的“一周开始”,并将您的@dowin parm 添加到其中。

于 2014-02-12T18:30:28.063 回答
0

尝试这个;

    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

希望这会奏效

于 2014-02-12T21:27:01.290 回答