获得第一周(周日)

时间:2012-09-18 16:18:50

标签: sql sql-server tsql date

我的专栏中有这个公式来计算给定周的开始日期:

dateadd(week,[Week]-(1),
 dateadd(day,(-1),
  dateadd(week,
   datediff(week,(0),
    CONVERT([varchar](4),[Year],(0))+'-01-01'),
     (1))))

WeekYear其他字段如382012

问题是,它计算星期一(9月17日)的第38/2012周的开始日期,我希望它是一个星期日而不是(9月16日)这可能吗?

非常感谢。

3 个答案:

答案 0 :(得分:1)

假设一周的第一天是星期日,这将返回给您一周的第一天,给出一周的数字和一年。
标准排除适用,例如不要试试1499年。

declare @tbl table ([Week] int, [Year] int)
insert @tbl select 38,2012
  union all select  1,2012
  union all select  0,2012
  union all select  1,2013

select DATEADD(
    Week,
    [Week]-1,
    DATEADD(
        Day,
        (8-@@datefirst)-DATEPART(dw, CAST([Year]*10000+101 AS VARCHAR(8))),
        CAST([Year]*10000+101 AS VARCHAR(8))))
from @TBL

结果

2012-09-16 00:00:00.000
2012-01-01 00:00:00.000
2011-12-25 00:00:00.000
2012-12-30 00:00:00.000

请注意,周数从1开始,如果周没有在星期日开始,则该周的第一天可能会在较早的一年结束(第4行)。因为周是相对的,你可以使用第0周,第1周等,它仍然会给你一个结果(第3行),无论是对还是错。

您可能还会注意到我使用了一种不同的方法来创建一年中的日期,作为替代方案。

<小时/> 无论您的(8-@@datefirst)设置如何,查询的DATEFIRST部分都会使其健壮。

答案 1 :(得分:0)

如果您希望每周的第一天是星期日,则可以使用DATEFIRST setting更改您的数据库。

答案 2 :(得分:0)

    function getFirstDateOfThisWeek(d)
    {
        var TempDate = new Date(d || new Date());            
        TempDate.setDate(TempDate.getDate() + (@Config.WeekStartOn - 1 - TempDate.getDay() - 7) % 7);            
        return TempDate;
    }

    var StartDate = getFirstDateOfThisWeek(new Date()); //1st date of this week