/*
Author:James
cDate :2014-02-12
Desc :平润年2月计算方法
Remark:这是本人业余时间写的一段SQL代码,如有思维漏洞请各位指教!
*/
--平年闰年计算规则:
--闰年:公元年数可被4整除为闰年,但是正百的年数必须是可以被400整除的才是闰年
--平年:其他都是平年
--select datepart(dw,'2011-02-01')
--select 2002%4
--2000~2099
declare @date smalldatetime ='1900-02-01'
if(isdate(@date)=0) begin
print '输入的日期有误,请核对后重新输入!'
end
else begin
--判断是闰年或平年
if(year(@date)%4=0) begin
if(right(year(@date),1)= 0 and left(right(year(@date),2),1) = 0) begin
if(year(@date)%400 = 0) begin
print '闰年:'+convert(varchar(4),year(@date))+'年'
print '2 月:29天'+char(13)+char(10)+'闰年:'+convert(varchar(4),year(@date))+'年'+'2月'
print '--------------------------------------------'
print ' 日 一 二 三 四 五 六'
print '--------------------------------------------'
--循环输出二月天数
declare @num int =1,@numstr varchar(50) = ''
set @date =convert(date,(convert(varchar(4),year(@date))+'-02-01'))
while(@num <=29) begin
set @date = dateadd(dd,@num-1,@date)
--控制空格数量
if(@num<10) begin
set @numstr +=space(2)+convert(varchar(20),@num)
end
else begin
set @numstr +=space(1)+convert(varchar(20),@num)
end
--控制打印
if(datepart(dw,convert(date,@date,120)) =7) begin
if(@num = 5) begin
set @numstr = space(5)+@numstr --如果是打印第一行则在变量前追加5个空格
end
print @numstr --打印输出
set @numstr = ''
end
--打印输出
if(@num =29) begin print @numstr end
set @num +=1 --累加
set @date =convert(date,(convert(varchar(4),year(@date))+'-02-01')) --每次在1号的基础之上累加一
end
print '--------------------------------------------'
end
else begin
print '平年:'+convert(varchar(4),year(@date))+'年'
print '2月:28天'
print '此处可参考平年算法'
end
end
else begin
print '闰年:'+convert(varchar(4),year(@date))+'年'
print '2月:29天'
print '此处可参考与计算正纪年闰年算法'
end
end
else begin
print '平年:'+convert(varchar(4),year(@date))+'年'
print '2 月:28天'+char(13)+char(10)+'平年:'+convert(varchar(4),year(@date))+'年'+'2月'
print '--------------------------------------------'
print ' 日 一 二 三 四 五 六'
print '--------------------------------------------'
--循环输出二月天数
declare @num_P int =1,@numstr_P varchar(50) = '',@TempDate datetime
set @date =convert(date,convert(date,(convert(varchar(4),year(@date))+'-02-01')),120)
while(@num_P <=28) begin
set @date = dateadd(dd,@num_P-1,@date)
--控制空格数量
if(@num_P<10) begin
set @numstr_P +=space(2)+convert(varchar(20),@num_P)
end
else begin
set @numstr_P +=space(1)+convert(varchar(20),@num_P)
end
--控制打印
if(datepart(dw,convert(date,@date,120)) = 7) begin
set @TempDate = convert(date,convert(date,(convert(varchar(4),year(@date))+'-02-01')),120)
if(datepart(dw,@TempDate) = 1 ) begin --星期日
set @numstr_P = space(0)+@numstr_P
end
else if(datepart(dw,@TempDate) = 2 and dateadd(dd,-5,@date) = @TempDate) begin --星期一
set @numstr_P = space(3)+@numstr_P
end
else if(datepart(dw,@TempDate) = 3 and dateadd(dd,-4,@date) = @TempDate) begin --星期二
set @numstr_P = space(6)+@numstr_P
end
else if(datepart(dw,@TempDate) = 4 and dateadd(dd,-3,@date) = @TempDate) begin --星期三
set @numstr_P = space(9)+@numstr_P
end
else if(datepart(dw,@TempDate) = 5 and dateadd(dd,-2,@date) = @TempDate) begin --星期四
set @numstr_P = space(12)+@numstr_P
end
else if(datepart(dw,@TempDate) = 6 and dateadd(dd,-1,@date) = @TempDate) begin --星期五
set @numstr_P = space(15)+@numstr_P
end
else if(datepart(dw,@TempDate) = 7 and dateadd(dd,0,@date) = @TempDate) begin --星期六
set @numstr_P = space(18)+@numstr_P
end
print @numstr_P --打印输出
set @numstr_P = ''
end
--打印输出
if(@num_P =28) begin print @numstr_P end
set @num_P +=1 --累加
set @date =convert(date,convert(date,(convert(varchar(4),year(@date))+'-02-01')),120) --每次在1号的基础之上累加一
end
print '--------------------------------------------'
end
end