0

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

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

其他字段在哪里Week和在哪里?Year382012

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

非常感谢。

4

3 回答 3

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

于 2012-09-18T19:09:49.003 回答
0

如果您希望一周的第一天是星期日,您可以使用DATEFIRST 设置更改您的数据库以使其如此。

于 2012-09-18T16:42:26.830 回答
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
于 2014-03-19T06:30:17.043 回答