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

  • 相关阅读:
    matlab 修改窗口logo 使用Javaframe
    matlab guide 开发心得
    判断两个集合的包含关系
    xaml 中 引用嵌套类的对象
    xaml中显示 “大括号左边” 文本
    步进电机脉冲与毫米
    最短路径:Dijkstra算法 C#
    JPA自定义sql的三种方式
    double相乘少一分的问题,BigDecimal参数传小数也会出问题
    String类小知识
  • 原文地址:https://www.cnblogs.com/ibgo/p/4106484.html
Copyright © 2011-2022 走看看