zoukankan      html  css  js  c++  java
  • 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--

  • 相关阅读:
    o9.17,习题
    09.17,二维数组,地图
    09.15,一维数组,冒泡排序
    09.11 小兔 成兔问题
    09.01,学习习题
    FTPHelper
    Wpf发送接收 win32消息
    win32Helper
    xml 封装类
    C# 多进程安全
  • 原文地址:https://www.cnblogs.com/ibgo/p/4106484.html
Copyright © 2011-2022 走看看