您好我正在尝试更改此函数以返回我想要成为星期一的第一天的日期。问题是当输入日期是星期日时它返回下一个星期一而不是前一星期一。例如,它应该产生输入 - >输出给定
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 :(得分: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 :(得分:1)
Sql Server中还有一个设置 - DATEFIRST
设置了一周的第一天(参见msdn)。
set datefirst 1 -- or @varDateFirst
go
将星期一设置为星期的第一天(美国默认值为7)。因此,您可以在需要时设置此变量并在之后重新设置 这是一个modified Ian Preston sqlfiddle example
答案 2 :(得分: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
答案 3 :(得分: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