开始周是星期六,结束星期是星期五,我想编写一个函数来返回日期的结束周。
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,因为我经常调用这个函数。
谢谢!
答案 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
;