--上季度 第一月第一天
convert(char(10), dateadd(mm, -3, dateadd(qq, datediff(qq,0,getdate()), 0)), 112)
--上季度 第一月最后一天
convert(char(10), dateadd(mm, -2, dateadd(qq, datediff(qq,0,getdate()), 0))-1, 112)
--上季度 第二月第一天
convert(char(10), dateadd(mm, -2, dateadd(qq, datediff(qq,0,getdate()), 0)), 112)
--上季度 第二月最后一天
convert(char(10), dateadd(mm, -1, dateadd(qq, datediff(qq,0,getdate()), 0))-1, 112)
--上季度 第三月第一天
convert(char(10), dateadd(mm, -1, dateadd(qq, datediff(qq,0,getdate()), 0)), 112)
--上季度 第三月最后一天
convert(char(10), dateadd(qq, datediff(qq,0,getdate()), 0)-1, 112)
以上我已测试过了,如果大家有疑义,可以自己推敲一下(之前使用过在网上搜的语句,结果发现是错的,所以大家在网上借鉴时最好能自己推敲一下)。
下面以求解 上季度第二月最后一天的语句 select convert(char(10), dateadd(mm, -1, dateadd(qq, datediff(qq,0,getdate()), 0))-1, 112) 为例,简单进行一下解释:
第一步:getdate()函数:返回当前日期和时间;
第二步:datediff(qq,0,getdate()):计算当前日期和“1900-01-01 00:00:00.000”这个日期之间的季度数;
第三步:dateadd(qq, datediff(qq,0,getdate()), 0):dateadd()函数增加第二步计算的季度数加到“1900-01-01 00:00:00.000”这个日期上,得到本季度的第一天;
第四步:dateadd(mm, -1, dateadd(qq, datediff(qq,0,getdate()), 0)):外层的dateadd()函数对第三步的计算得到的日期的月上加-1,得到上季度第三月的第一天;
第五步:dateadd(mm, -1, dateadd(qq, datediff(qq,0,getdate()), 0))-1:将上季度第三月的第一天减一就得到上季度第二月最后一天;
第六步:convert(char(10), dateadd(mm, -1, dateadd(qq, datediff(qq,0,getdate()), 0))-1, 112):使用convert()函数将日期格式转换为“YYYYMMDD”,如20110831。
datediff()函数见:http://www.w3school.com.cn/sql/func_datediff.asp
dateadd()函数见:http://www.w3school.com.cn/sql/func_dateadd.asp
convert()函数见:http://www.w3school.com.cn/sql/func_convert.asp