34,591
社区成员
发帖
与我相关
我的任务
分享
declare @a datetime
set @a = '2008-1-1'
if object_id('tb_tmp') is not null
drop table tb_tmp
create table tb_tmp
( y datetime )
while year(@a)= '2008'
begin
insert into tb_tmp values (@a)
set @a=@a + 1
end
select count(*) from tb_tmp where datepart(dw,y)=6
create proc p_count
@year int
as
set datefirst 1
select top 366 id=identity(int,0,1) into # from syscolumns
select 周日个数=count(1) from #
where datepart(dw,dateadd(dd,id,ltrim(@year)+'-1-1'))=7
and dateadd(dd,id,ltrim(@year)+'-1-1')<ltrim(@year+1)+'-1-1'
go
--得出2008年有多少个周日。
exec p_count 2008
set datefirst 1 -- 设周一为第一天
select datepart(week,'2008-1-6')
--2005
set datefirst 1
;with cte as
(
select dt=cast(convert(varchar(5),getdate(),120)+'1-1' as datetime),[year]=year(getdate())
union all
select dateadd(day,1,c.[dt]),c.[year]
from cte c
where year(dateadd(day,1,c.[dt]))=c.[year]
)
select count(*) cnt
from cte
where (datepart(weekday,dt)+@@datefirst-1)=7
option (maxrecursion 0)
--2000
select top 366 id=identity(int,1,1) into # from syscolumns,sysobjects
select count(*) cnt
from
(
select dateadd(day,id,convert(varchar(5),getdate(),120)+'1-1') dt
from #
where dateadd(day,id,convert(varchar(5),getdate(),120)+'1-1')<=convert(varchar(5),getdate(),120)+'12-31'
) t
where (datepart(weekday,dt)+@@datefirst-1)=7
drop table #
/*
cnt
-----------
52
(1 行受影响)
*/
--2005
set datefirst 7
;with cte as
(
select dt=cast(convert(varchar(5),getdate(),120)+'1-1' as datetime),[year]=year(getdate())
union all
select dateadd(day,1,c.[dt]),c.[year]
from cte c
where year(dateadd(day,1,c.[dt]))=c.[year]
)
select count(*) cnt
from cte
where (datepart(weekday,dt)+@@datefirst-1)=7
option (maxrecursion 0)
--2000
select top 366 id=identity(int,1,1) into # from syscolumns,sysobjects
select count(*) cnt
from
(
select dateadd(day,id,convert(varchar(5),getdate(),120)+'1-1') dt
from #
where dateadd(day,id,convert(varchar(5),getdate(),120)+'1-1')<=convert(varchar(5),getdate(),120)+'12-31'
) t
where (datepart(weekday,dt)+@@datefirst-1)=7
drop table #
set datefirst 7
--2005
;with cte as
(
select dt=cast(convert(varchar(5),getdate(),120)+'1-1' as datetime),[year]=year(getdate())
union all
select dateadd(day,1,c.[dt]),c.[year]
from cte c
where year(dateadd(day,1,c.[dt]))=c.[year]
)
select count(*) cnt
from cte
where (datepart(weekday,dt)+@@datefirst-1)=7
option (maxrecursion 0)
--2000
select top 366 id=identity(int,1,1) into # from syscolumns,sysobjects
select count(*) cnt
from
(
select dateadd(day,id,convert(varchar(5),getdate(),120)+'1-1') dt
from #
where dateadd(day,id,convert(varchar(5),getdate(),120)+'1-1')<=convert(varchar(5),getdate(),120)+'12-31'
) t
where (datepart(weekday,dt)+@@datefirst-1)=7
select datepart(week,'2008-12-31')