获取结束周日期功能

时间:2014-07-21 03:35:00

标签: sql sql-server-2008 sql-function dateadd

开始周是星期六,结束星期是星期五,我想编写一个函数来返回日期的结束周。

e.g.
'2014-6-26' (Thursday) would return '2014-6-27' (Friday)
'2014-6-27' (Friday) would return '2014-6-27' (same day)
'2014-6-28' (Sat) would return '2014-7-04' (next Friday)

因为我无法在函数中设置DATEFIRST,所以我很难创建这个函数。

这是我到目前为止所得到的。它适用于所有场景,除非我输入星期六它返回上一个星期五(这是错误的)。例如' 2014年6月28日'返回' 2014-6-27'

CREATE FUNCTION [GetEndWeek](
@Date DATETIME
)
RETURNS DATETIME 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS
BEGIN
RETURN DATEADD(DAY,(13 - (@@DATEFIRST + DATEPART(WEEKDAY, @Date )))%7,@Date )
END

任何帮助表示感谢。

我不想在其他任何地方(即在过程中)设置DATEFIRST,因为我经常调用这个函数。

谢谢!

2 个答案:

答案 0 :(得分:2)

假设该语言为英语,则应使用datename()而不是datepart()datepart()受制于系统值。我认为这种逻辑符合你的要求:

return dateadd(day,
               (case datename(weekday, @Date)
                     when 'Saturday' then 6
                     when 'Sunday' then 5
                     when 'Monday' then 4
                     when 'Tuesday' then 3
                     when 'Wednesday' then 2
                     when 'Thursday' then 1
                     when 'Friday' then 0
                end),
               @Date);

答案 1 :(得分:0)

我不确定现有功能是否正确,它给了我一栏" prev_func"下面,所以对于6月28日星期六,我预计接下来的星期五(7月4日),就像这样:

|                   ADATE | MODULUS_7 |            NEW_METHOD |             PREV_FUNC |
|-------------------------|-----------|-----------------------|-----------------------|
| Thursday, June 26, 2014 |         1 | Friday, June 27, 2014 | Friday, June 27, 2014 |
|   Friday, June 27, 2014 |         0 | Friday, June 27, 2014 | Friday, June 27, 2014 |
| Saturday, June 28, 2014 |        -1 | Friday, July 04, 2014 | Friday, June 27, 2014 |

您不必使用@@ datefirst或更改datefirst以达到可预测的星期几计算。 sql server中的日期为零,1900-01-01是星期一,所以datediff(day,0,[date-here]) % 7是可预测的,零(无余数)是星期一,星期五是4。

我相信您需要的计算在下面的查询中,列" new_method" :

select
      format(adate,'D') as adate

    , 4 - (datediff(day,0,adate) % 7) as modulus_7

    , format(
             case when 4 - datediff(day,0,adate) % 7 < 0
                then dateadd(day,4 - (datediff(day,0,adate) % 7) + 7,adate)
             else dateadd(day,4 - datediff(day,0,adate) % 7,adate)
             end
      ,'D') as new_method

    , format(dbo.getendweek(adate),'D') as prev_func

from table1
;

请参阅:http://sqlfiddle.com/#!6/0903f/16