【问题标题】:Get end week date function获取结束星期日期函数
【发布时间】:2014-09-11 12:02:03
【问题描述】:

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

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

任何帮助表示赞赏。

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

谢谢!

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 哦,你的意思是 datename 而不是 datepart!如果我换个地方就可以了!
  • @Gordan 很棒的逻辑... 1 票赞成。
  • @viv_acious 。 . .对于那个很抱歉。在描述中正确,但不是查询(现已修复)。
【解决方案2】:

我不确定现有函数是否正确,它给了我下面的“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多