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)
)
AS
BEGIN
/*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()
--or
SET @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);
        RETURN
END

这个函数的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--

原文地址:https://www.cnblogs.com/ibgo/p/4106484.html