Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取周末日期函数_Sql_Sql Server 2008_Sql Function_Dateadd - Fatal编程技术网

Sql 获取周末日期函数

Sql 获取周末日期函数,sql,sql-server-2008,sql-function,dateadd,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,所以我正在努力创建此函数 这就是

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

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,所以我正在努力创建此函数

这就是我目前得到的。它在所有情况下都有效,除非我进入星期六,它返回上一个星期五(这是错误的)。e、 g.“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
谢谢你的帮助

我不想在其他任何地方(例如在procs中)设置DATEFIRST,因为我经常调用这个函数


谢谢

假设语言是英语,您应该使用
datename()
而不是
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);

我不确定现有函数是否正确,它给了我下面的“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中的日期0是星期一,因此
datediff(day,0,[date here])%7
是可预测的,0(无余数)是星期一,星期五是4

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

选择
格式(adate,'D')为adate
,4-(datediff(day,0,adate)%7)作为模量_7
,格式(
4-datediff(日,0,日)7<0时的情况
然后dateadd(day,4-(datediff(day,0,adate)%7)+7,adate)
else dateadd(第4天-日期差异(第0天,日期)%7,日期)
结束
“D”)作为新的_方法
,格式(dbo.getendweek(adate),'D')为prev_func
来自表1
;

请参阅:

Ohh您指的是datename而不是datepart!如果我交换一下就行了@戈尔丹伟大的逻辑。。。1票赞成。@viv_icious。很抱歉。在描述中得到了正确的结果,但没有查询(现已修复)。
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
;