【发布时间】:2014-06-20 13:49:24
【问题描述】:
我想计算给定年份第一个 ISO 8601 周的第一天(星期一),然后枚举给定年份的所有 ISO 8601 周,包括它们的数字。我想知道这是否可以比我迄今为止做得更好,也许使用内置函数 datepart(iso_week, getdate())?这是我的代码:
DECLARE @y as int = 2011
DECLARE @firstDayOfYear date = CAST(CAST(@y AS varchar(4)) + '-01-01' AS DATE)
--thursday before 1st Jan
DECLARE @Thursday date = DATEADD(day,
3 - (DATEPART(dw, @firstDayOfYear) + @@DATEFIRST - 2) % 7,
@firstDayOfYear)
DECLARE @FirstDayOfIsoWeek date = DATEADD(day,
- (DATEPART(dw, @firstDayOfYear) + @@DATEFIRST - 2) % 7,
@firstDayOfYear)
if (@Thursday<@firstDayOfYear)
SELECT @FirstDayOfIsoWeek = DATEADD(d,7, @FirstDayOfIsoWeek)
SELECT @FirstDayOfIsoWeek
我也在寻找一种方法来枚举从第一个星期一开始的所有 ISO 周,作为包含 StartDate、EndDate、Year、Month、ISOWeekNo 列的周期表。如果有人知道快速干净的解决方案,请提供帮助。
接受的解决方案:
我做了一些编辑,所以它可以按我的需要工作 - 以 Outlook 日历方式枚举一年中的周数:
CREATE FUNCTION [dbo].[FGetISOWeeks](@y int)
RETURNS
@ISOWeeks TABLE (StartDate Date NOT NULL, EndDate Date NOT NULL, YearNo int not null, MonthNo int not null, WeekNo int not null)
AS
BEGIN
DECLARE @weeknumbers as TABLE ( weeknum int not null primary key (weeknum)) -- helper table of week numbers
declare @weeknum int = 1
while (@weeknum <= 53)
begin
insert @weeknumbers values(@weeknum)
set @weeknum = @weeknum + 1
end
DECLARE @firstDayOfYear date = CAST(CAST(@y AS varchar(4)) + '-01-01' AS DATE)
DECLARE @Thursday date = DATEADD(day,3 - (DATEPART(dw, @firstDayOfYear) + @@DATEFIRST - 2) % 7,@firstDayOfYear) --thursday before 1st Jan
DECLARE @FirstDayOfIsoWeek date = DATEADD(day, - (DATEPART(dw, @firstDayOfYear) + @@DATEFIRST - 2) % 7, @firstDayOfYear)
if (@Thursday<@firstDayOfYear) SELECT @FirstDayOfIsoWeek = DATEADD(d,7, @FirstDayOfIsoWeek) -- calculate first day of iso year
declare @Monday0 date = DATEADD(d,-7, @FirstDayOfIsoWeek)
INSERT INTO @ISOWeeks
select DATEADD(WEEK, N.weeknum, @Monday0) as StartDate
,DATEADD(day, 7*N.weeknum+6, @Monday0) as EndDate, @y as YearNo
,DATEPART(month, DATEADD(DAY, 7*N.weeknum+3, @Monday0)) as MonthNo
,DATEPART(ISO_WEEK, DATEADD(WEEK, N.weeknum, @Monday0)) as WeekNo
from @weeknumbers N
where DATEPART(year, DATEADD(day, 7*N.weeknum+3, @Monday0)) = @y
order by N.weeknum
RETURN
END
【问题讨论】:
标签: sql sql-server date iso8601