2014-02-12 78 views
1

信息:MS SQL Server 2008 R2MSSQL - 在範圍內查找DATE(函數?)

您好。我正在嘗試創建一個具有兩個參數輸入和一個輸出的函數。這兩個輸入是一週中的一天,INT(@dowin)從星期一開始爲1,還有一個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年2月11日07:30:00.000 根據@dowin 2014年2月10日至2014年2月16日 在此範圍內@newdate將是2014年2月12日07:: - @datein應該找到的範圍30:00.000

**E DIT* ** 我能夠大家用更簡單的功能assitance後解決:


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 
+1

您能不能告訴我們具體是什麼,你想獲得?到目前爲止,您是否遇到了具體的問題? – Andrew

+0

@Andrew請參閱底部的更新。 –

+0

@Andrew,因爲結果不一致,所以我沒有將您標記爲正確答案。我用一個更簡單的解決方案解決了這個問題。更新的問題。 –

回答

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 [email protected]+1 
      DECLARE @startOfWeek int = Datepart(DW,@datein) 
    if @startOfWeek<@dowinf set @newdate = dateadd(day,@[email protected],@datein) else if @startOfWeek>@dowinf set @newdate = dateadd(day,7-(@[email protected]),@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 

希望這將工作

+1

這是一個很棒的解決方案!謝謝! –

+0

非常歡迎 –

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 Fiddle

我只是用你的邏輯來計算你的「開始的一週」(剛剛做成日期時間),並添加你的@dowin parm。

+0

敬畏,輝煌。這正是我在錯誤的方向思考的地方。當我剛剛修改原始值時,我試圖在一個範圍內查明一個dw。血腥的輝煌和作品像一個魅力。謝謝! –