日期:2014-05-18  浏览次数:20491 次

急-处理跨年情况
declare @Sddate1 datetime
declare @Sddate2 datetime

declare @NowDay varchar
declare @NowMonth varchar
declare @NowYear varchar

declare @NowMonth varchar

select @NowMonth=convert(varchar,datename(mm,getdate()))

--处理跨年情况--检查每月16-31号
if @NowMonth='01'
  select @Sddate2=convert(datetime,convert(varchar,datename(yy,getdate())-1)+'-12-16')
else
  select @Sddate2=convert(datetime,convert(varchar,datename(yy,getdate()))+'-'+convert(varchar,datename(mm,getdate())-1)+'-16')



问题当@NowMonth='01'
时,程序执行这个了:select @Sddate2=convert(datetime,convert(varchar,datename(yy,getdate())-1)+'-12-16')

为什么还提示select @Sddate2=convert(datetime,convert(varchar,datename(yy,getdate()))+'-'+convert(varchar,datename(mm,getdate())-1)+'-16')
这句  从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界。convert(varchar,datename(mm,getdate())-1)此时=00了
条件不满足,也检查了,怎么处理呢?
谢谢了

------解决方案--------------------
两种改法:
1.declare @NowMonth varchar(2), 
2.select @NowMonth=convert(varchar(2),datename(mm,getdate()))

测试的时候发现, 如果两个都只是varchar,那么@NowMonthe会等于0

Sample:
declare @NowMonth
select @NowMonth=convert(VARCHAR,'03')
select @NowMonth
结果会是 0 


------解决方案--------------------
你不应该单纯用 convert去处理日期,
11年1月 转换成月数减一就变成0月了。

应该 select MONTH(DATEADD(mm, -1, getdate())) 这个才是正确的日期上个月。
SQL code

select  上个月16日 = dateadd(dd, -datepart(dd,DATEADD(mm, -1, getdate()))+16, DATEADD(mm, -1, getdate())),
        本月16日 =  dateadd(Dd, -DATEPART(DD, GETDATE())+16, GETDATE())