day()函数是获取某个时间的天数,参数必须是日期字段类型
1、当数据字段类型是int时,且是某月的第一天
思路:获取到某月的最后一天,即下个月第一天的前一天日期,用day()函数取到天数
例如 m_date=20150201
首先转换成字符型:
convert(varchar(8),m_date+100 ,112)
其中:加100是取下个月的第一天,112代表yyyymmdd格式的日期
然后转换成日期型:
cast(convert(varchar(8),m_date+100,112) as datetime);//下个月的第一天
cast(convert(varchar(8),m_date+100,112) as datetime)-1;//下个月的第一天的前一天
然后就可以用day()函数了:
day(cast(convert(varchar(8),m_date+100 ,112) as datetime)-1)
到这里,需要解决一个BUG,那就是当m_date=20141201时,转换成日期时会报错,因为没有20141301的日期,所以需要特殊处理一下,将20141201+8900=20150101
假设有个记录月份的字段m_month,可以这么写:
case when m_month=12 then
day(cast(convert(varchar(8),m_date+8900 ,112) as datetime)-1)
else
day(cast(convert(varchar(8),m_date+100 ,112) as datetime)-1)
2、当数据字段类型是int时,任意一天时间
思路:同上,即获取到某月的最后一天,即下个月第一天的前一天日期,用day()函数取到天数
例如 m_date=20150204
day(cast(convert(varchar(8),(m_date-m_date%100+1+100) ,112) as datetime)-1)
这个也要根据月份特殊处理一下,此处不给答案了
3、当有2个数据字段类型是int时,一个是年,一个是月份
day(cast(CAST(m_year as varchar(4))+'-'+CAST(m_month+1 as varchar(2))+'-01' as datetime)-1)
这个也要根据月份特殊处理一下,此处不给答案了
4、获取当前日期的月天数
SELECT 32-DAY(getdate()+32-DAY(getdate()))