1

情報: MS SQL Server 2008 R2

こんにちは。2 つのパラメーター入力と 1 つの出力を持つ関数を作成しようとしています。2 つの入力は、月曜日を 1 として開始する 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 その範囲内で@dowin によると、@newdate は 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

これを試して;

    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 に答える
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 フィドル

ロジックを使用して「週の始まり」を計算し(datetimeにしただけです)、@dowin parmを追加しています。

于 2014-02-12T18:30:28.063 に答える