我的专栏中有这个公式来计算给定周的开始日期:
dateadd(week,[Week]-(1),
dateadd(day,(-1),
dateadd(week,
datediff(week,(0),
CONVERT([varchar](4),[Year],(0))+'-01-01'),
(1))))
Week
和Year
其他字段如38
和2012
问题是,它计算星期一(9月17日)的第38/2012周的开始日期,我希望它是一个星期日而不是(9月16日)这可能吗?
非常感谢。
答案 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