1

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

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

4 回答 4

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);
于 2013-07-04T17:23:33.680 回答
1

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

set datefirst 1 -- or @varDateFirst
go

将星期一设置为一周的第一天(在美国默认值为 7)。因此,您可以在需要时设置此变量,然后再将其设置回来。
这是一个修改后的 Ian Preston sqlfiddle 示例

于 2013-07-04T22:25:27.620 回答
0

您需要RETURNCASE声明之前,而不是在其中。

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 与演示

于 2013-07-04T16:23:01.350 回答
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
于 2013-07-04T16:26:46.380 回答