SQL Dynamic DatePart when using DateDiff

前端 未结 6 2094
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-10 01:07

Is there a way to pass the DatePart parameter of DateDiff as a variable? So that I can write code that is similar to this?

DECLARE @datePart VARCHAR(2)
DECLA         


        
6条回答
  •  温柔的废话
    2020-12-10 02:00

    Old but still valid unfortunately.

    I did it the case way and just want to share the code so you don't have to do all the annoying typing I had to do. Covers all possible date parts. Just replace the name of the function and the date function to implement for other T-SQL date functions.

    Copy and paste section

    -- SELECT dbo.fn_DateAddFromStringPart('year', 1, GETDATE())
    CREATE FUNCTION fn_DateAddFromStringPart
    (
        @Interval VARCHAR(11),
        @Increment INT,
        @Date SMALLDATETIME
    )
    RETURNS DATETIME
    AS
    BEGIN
        -- Declare the return variable here
        DECLARE @NewDate DATETIME
    
        -- Add the T-SQL statements to compute the return value here
        SELECT @NewDate = CASE
            WHEN @Interval IN ('year', 'yy', 'yyyy') THEN DATEADD(YEAR, @Increment, @Date)
            WHEN @Interval IN ('quarter', 'qq', 'q') THEN DATEADD(QUARTER, @Increment, @Date)
            WHEN @Interval IN ('month', 'mm', 'm') THEN DATEADD(MONTH, @Increment, @Date)
            WHEN @Interval IN ('dayofyear', 'dy', '') THEN DATEADD(DAYOFYEAR, @Increment, @Date)
            WHEN @Interval IN ('day', 'dd', 'd') THEN DATEADD(DAY, @Increment, @Date)
            WHEN @Interval IN ('week', 'wk', 'ww') THEN DATEADD(WEEK, @Increment, @Date)
            WHEN @Interval IN ('weekday', 'dw', 'w') THEN DATEADD(WEEKDAY, @Increment, @Date)
            WHEN @Interval IN ('hour', 'hh') THEN DATEADD(HOUR, @Increment, @Date)
            WHEN @Interval IN ('minute', 'mi', 'n') THEN DATEADD(MINUTE, @Increment, @Date)
            WHEN @Interval IN ('second', 'ss', 's') THEN DATEADD(SECOND, @Increment, @Date)
            WHEN @Interval IN ('millisecond', 'ms') THEN DATEADD(MILLISECOND, @Increment, @Date)
            WHEN @Interval IN ('microsecond', 'mcs') THEN DATEADD(MICROSECOND, @Increment, @Date)
            WHEN @Interval IN ('nanosecond', 'ns') THEN DATEADD(NANOSECOND, @Increment, @Date)
        END
    
        -- Return the result of the function
        RETURN @NewDate
    
    END
    GO
    

提交回复
热议问题