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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM