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

  • 相关阅读:
    移除DOM节点
    php 301重定向
    PHP 面向对象:方法重载
    JSON
    轮播图alt作为标题
    php 开发规范
    struts2文件上传 判断大小
    twitter api
    php 方法重写,参数不同,报错: Declaration of should be compatible with that
    Delphi中判断当前程序运行过程中长时间无鼠标与键盘操作
  • 原文地址:https://www.cnblogs.com/ibgo/p/4106484.html
Copyright © 2011-2022 走看看