首页 > 代码库 > SQL 生成一个日期范围
SQL 生成一个日期范围
有时想按日或月生成一个序列,就像2014-1-1、2014-1-2、2014-1-3...
在sql server中可以写个函数来实现。
/*生成一个日期范围,如2014.01、2014.02...@Increment 步进值@StartDate 开始日期@EndDate 结束日期----------------------@SelectedRange 返回值名称(多语句表值函数的返回值必须存放在返回值变量中) 返回表的字段和类型: iDate DATETIME, iYear char(4), iMonth char(2), iYM CHAR(7)*/CREATE FUNCTION [dbo].[DateRange]( @Increment char(1) = ‘m‘, @StartDate DATE=‘20140101‘, @EndDate DATE=null)RETURNS @SelectedRange TABLE( iDate DATE, iYear char(4), iMonth char(2), iYM CHAR(7))ASBEGIN/*Default value for stored procedures parameter have to be constants. The function GETDATE() returns a different value from time to time, so it is not a constant expression.*/--IF @EndDate is null--SET @EndDate = getdate()--orSET @EndDate=Coalesce(@EndDate,GetDate()) ;WITH cteRange(DateRange) AS ( SELECT CAST(@StartDate AS DATE) UNION ALL SELECT CASE WHEN @Increment = ‘d‘ THEN DATEADD(dd, 1, DateRange) WHEN @Increment = ‘w‘ THEN DATEADD(ww, 1, DateRange) WHEN @Increment = ‘m‘ THEN DATEADD(mm, 1, DateRange) END FROM cteRange WHERE DateRange <= CASE WHEN @Increment = ‘d‘ THEN DATEADD(dd, -1, @EndDate) WHEN @Increment = ‘w‘ THEN DATEADD(ww, -1, @EndDate) WHEN @Increment = ‘m‘ THEN DATEADD(mm, -1, @EndDate) END ) INSERT INTO @SelectedRange(iDate,iYear,iMonth,iYM) SELECT DateRange, YEAR(DateRange) [Year], MONTH(DateRange) [Month] ,CONVERT(VARCHAR(7),DateRange,102)[YM] FROM cteRange OPTION (MAXRECURSION 0); RETURNEND
这个函数的3个参数都设置了默认值,那么在调用的时候怎么用呢?
SELECT * FROM DateRange()
这样不写实参是不行的,如果都要用默认值,那么要写default:
SELECT * FROM DateRange(default,default,default)
如果有参数要传入:
SELECT * FROM DateRange(‘d‘,‘2014/1/1‘,‘2014/12/1‘)
这样就会显示1月1日到12月1日每天的数据:
注意在函数的参数中想写getdate()函数是不行的,因为参数要用常量,而getdate函数是个变量,所以要变通一下。
--End--
SQL 生成一个日期范围
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。