1

こんにちは、この関数を変更して、月曜日にしたい週の最初の日の日付を返そうとしています。問題は、入力日付が日曜日の場合、前の月曜日ではなく次の月曜日を返すことです。たとえば、入力->出力が与えられた

2013-06-11 -> 2013-06-10
2013-06-16 -> 2013-06-10

日曜日が唯一の問題なので、ケースを追加しました

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[ufn_GetFirstDayOfWeek]
( @pInputDate    DATETIME )
RETURNS DATETIME

BEGIN

SET @pInputDate = CONVERT(VARCHAR(10), @pInputDate, 111)

 CASE WHEN DATENAME(dw, @pInputDate) = 'Sunday' THEN RETURN DATEADD(DD, -5- DATEPART(DW, @pInputDate),
              @pInputDate) ELSE RETURN DATEADD(DD, 2- DATEPART(DW, @pInputDate),
              @pInputDate) END

END

問題は、キーワード「Case」の近くで不正な構文というエラーが表示されることです。この問題を解決するためのより良い方法はありますか?

4

4 に答える 4

2

SQL カレンダーの 0 日目は月曜日です。

select datename(dw, 0);

この知識があれば、簡単に計算できます。7 で割り、床を取り、7 を掛けるだけです。

declare @d datetime = '20130611';
select dateadd(day, floor(cast(@d as int) / 7.00) * 7.00, 0);
set @d = '20130616';
select dateadd(day, floor(cast(@d as int) / 7.00) * 7.00, 0);
set @d = getdate();
select dateadd(day, floor(cast(@d as int) / 7.00) * 7.00, 0);
于 2013-07-04T17:23:33.680 に答える
0

RETURNステートメント内ではなく、ステートメントの前にある必要がありますCASE

ALTER FUNCTION [dbo].[ufn_GetFirstDayOfWeek]
( @pInputDate    DATETIME )
RETURNS DATETIME

BEGIN

SET @pInputDate = CONVERT(VARCHAR(10), @pInputDate, 111)

RETURN CASE WHEN DATENAME(dw, @pInputDate) = 'Sunday' THEN DATEADD(DD, -5- DATEPART(DW, @pInputDate),
              @pInputDate) ELSE DATEADD(DD, 2- DATEPART(DW, @pInputDate),
              @pInputDate) END

END

demo を使用した SQL Fiddle

于 2013-07-04T16:23:01.350 に答える
0
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
alter FUNCTION [dbo].[ufn_GetFirstDayOfWeek]
( @pInputDate    DATETIME )
RETURNS DATETIME

BEGIN

SET @pInputDate = CONVERT(VARCHAR(10), @pInputDate, 111)

declare @retDate datetime

set @retDate = CASE DATENAME(dw, @pInputDate) 
        WHEN 'Sunday' THEN DATEADD(DD, -5- DATEPART(DW, @pInputDate),@pInputDate) 
        ELSE DATEADD(DD, 2- DATEPART(DW, @pInputDate), @pInputDate) 
END

return @retDate
END
于 2013-07-04T16:26:46.380 に答える