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

  • 相关阅读:
    python按行读取并替换
    python 爬取网页内容
    file.write(str),file.writelines(sequence)
    04Spring_bean 后处理器(后处理Bean),BeanPostProcessor ,bean创建时序,动态代理
    03Spring_bean的创建和作用域以及生命周期
    02Spring_Ioc和DI介绍
    01Spring_基本jia包的导入andSpring的整体架构and怎么加入日志功能
    错题724-java
    05传智_jbpm与OA项目_部门模块中增加部门的jsp页面增加一个在线编辑器功能
    04传智_jbpm与OA项目_部门模块改进_直接在BaseAction中实现ModelDriven<T>
  • 原文地址:https://www.cnblogs.com/ibgo/p/4106484.html
Copyright © 2011-2022 走看看