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--

  • 相关阅读:
    课堂作业04 2017.10.27
    课程作业 03 动手动脑 2017.10.20
    课程作业 03 2017.10.20
    HDU 3974 Assign the task
    POJ 2155 Matrix
    POJ 2481 Cows
    HDU 3038 How Many Answers Are Wrong
    CS Academy Array Removal
    POJ_1330 Nearest Common Ancestors LCA
    CF Round 427 D. Palindromic characteristics
  • 原文地址:https://www.cnblogs.com/ibgo/p/4106484.html
Copyright © 2011-2022 走看看