2013-07-04 123 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