一周的第一天

时间:2013-07-04 16:19:46

标签: sql sql-server sql-server-2008

您好我正在尝试更改此函数以返回我想要成为星期一的第一天的日期。问题是当输入日期是星期日时它返回下一个星期一而不是前一星期一。例如,它应该产生输入 - >输出给定

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 个答案:

答案 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

SQL Fiddle with demo

答案 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