码迷,mamicode.com
首页 > 数据库 > 详细

SQL 生成一个日期范围

时间:2014-11-18 23:17:07      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   sp   for   数据   

有时想按日或月生成一个序列,就像2014-1-1、2014-1-2、2014-1-3...

 

bubuko.com,布布扣

 

在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日每天的数据:

bubuko.com,布布扣

 

注意在函数的参数中想写getdate()函数是不行的,因为参数要用常量,而getdate函数是个变量,所以要变通一下。

--End--

SQL 生成一个日期范围

标签:style   blog   http   io   color   ar   sp   for   数据   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!