Sql 一周的第一天

Sql 一周的第一天,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,您好,我正在尝试使用alter this函数返回一周中第一天的日期,我希望该日期为星期一。问题是,当输入日期为星期日时,它将返回下一个星期一,而不是上一个星期一。例如,它应产生input->Output QUIRED 2013-06-11 -> 2013-06-10 2013-06-16 -> 2013-06-10 因为星期天是唯一的问题,我加了一个案例 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION

您好,我正在尝试使用alter this函数返回一周中第一天的日期,我希望该日期为星期一。问题是,当输入日期为星期日时,它将返回下一个星期一,而不是上一个星期一。例如,它应产生input->Output QUIRED

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”附近遇到了一个错误,语法不正确。有没有更好的方法来解决这个问题?

您需要在
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日历的第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);

Sql Server中还有一个设置-
DATEFIRST
,用于设置一周的第一天(请参阅)

将星期一设置为一周的第一天(在美国,默认值为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);
set datefirst 1 -- or @varDateFirst
go