1

給与計算の週の開始日を把握することになっているストアド関数があります。これは「木曜日」ですが、ストアド プロシージャは常に開始日を「金曜日」として取得します。宣言関数と設定関数の何が問題になっていますか? StartWeekDay を "Thursday" にしたい... アカウント テーブルで "lStartday" が "5" に設定されている 私のコードは以下のとおりです。

DECLARE @StartWeekDay int 
SET @StartWeekDay = (Select lStartDay From Account Where lLocationID = 1)

DECLARE @CurrentDate DateTime 
SET @CurrentDate = GetDate()
DECLARE @CurrentWeekDay int
SET @CurrentWeekDay = DATEPART(dw,@CurrentDate)

DECLARE @Diff int
SET @Diff = @StartWeekDay - @CurrentWeekDay

SET @Diff = Case When @Diff > 0 Then -6 When @Diff = 0 Then 0 Else @Diff End

--
 DECLARE @DaysToStart int
 SET @DaysToStart = (DatePart(dw,@CurrentDate) - @StartWeekDay)
 IF @DaysToStart <= .1 
  BEGIN
    SET @DaysToStart = @DaysToStart + 7 
  END

 DECLARE @myStartWeekDate DateTime
 --SET @myStartWeekDate = dbo.DateOnly(DATEADD(d,@Diff,@CurrentDate))
 SET @myStartWeekDate =  Convert(nvarchar,DateAdd(d,-@DaysToStart,@CurrentDate),101) -- getting DATE only
--
4

3 に答える 3

4

次のクエリは、日付を週の初めに丸める標準的な方法です。ただし、それは月曜日として扱われます...

DATEADD(WEEK, DATEDIFF(WEEK, 0, @YourDate), 0)

値を 3 オフセットすると、関数は前の木曜日に切り捨てられます...

DATEADD(WEEK, DATEDIFF(WEEK, 0, @YourDate-3), 3)

編集:これは 4 ではなく 3 であるべきでした...

SET @yourDate    = getDate()
SET @firstDay    = 3
SET @RoundedDate = DATEADD(WEEK, DATEDIFF(WEEK, 0, @YourDate-@firstDay), @firstDay)

 Value of @firstDay | Day of week this will round to
--------------------+--------------------------------
        0           |        Monday
        1           |        Tuesday
        2           |        Wednesday
        3           |        Thursday
        4           |        Friday
        5           |        Saturday
        6           |        Sunday
于 2012-08-16T13:22:40.467 に答える
1

lStartDay = 5 は常に金曜日になります。木曜日には 4 を追加する必要があります

DECLARE @DaysToStart int
 SET @DaysToStart = (DatePart(dw,@CurrentDate) - @StartWeekDay)
 IF @DaysToStart <= .1 
  BEGIN
    SET @DaysToStart = @DaysToStart + 7 
  END

@DaysToStart を宣言し、DatePart も INT を返す場合、なぜ .1 と比較するのですか??

于 2012-08-16T13:12:48.277 に答える
0
        DECLARE @StartWeekDay int 
    SET @StartWeekDay = 5

    DECLARE @CurrentDate DateTime 
    SET @CurrentDate = '8/24/2012'
    DECLARE @CurrentWeekDay int
    SET @CurrentWeekDay = DATEPART(dw,@CurrentDate)
    SELECT @CurrentWeekDay;

    DECLARE @Diff int
    SET @Diff = @StartWeekDay - @CurrentWeekDay

    SET @Diff = Case When @Diff > 0 Then -6 When @Diff = 0 Then 0 Else @Diff End

    --
     DECLARE @DaysToStart int
     SET @DaysToStart = (DatePart(dw,@CurrentDate) - @StartWeekDay)
--change here to <1 and not <=1 that will add 8 and return friday at the end
     IF @DaysToStart < 1 
      BEGIN
        SET @DaysToStart = @DaysToStart + 7 
      END
      SELECT @DaysToStart;
     DECLARE @myStartWeekDate DateTime
     --SET @myStartWeekDate = dbo.DateOnly(DATEADD(d,@Diff,@CurrentDate))
     SET @myStartWeekDate =  Convert(nvarchar,DateAdd(d,-@DaysToStart,@CurrentDate),101) 
     SELECT @myStartWeekDate
于 2012-08-16T13:23:04.333 に答える