2013-07-04 120 views
1

你好,我正在嘗試修改這個函數來返回我想成爲星期一的第一天的第一天的日期。問題是當輸入日期是星期天它返回下一個星期一而不是以前one.For例如,它應該產生輸入 - >輸出給本週第一天

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'。是否有更好的方法來解決這個問題?

回答

0

您需要在CASE聲明之前有RETURN,而不是在其中。

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 

SQL Fiddle with demo

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

還有SQL Server中的設置 - DATEFIRST其設置一週的第一天(見msdn)。

set datefirst 1 -- or @varDateFirst 
go 

將設置星期一作爲星期的第一天(美國默認值爲7)。所以你可以在需要時設置這個變量,並在之後設置它。
這裏是一個modified Ian Preston sqlfiddle example