• Interesting, I took a very different approach when I wrote this similar function years ago.


    CREATE FUNCTION dbo.DateTime2Precision (@dt datetime2(7), @precision varchar(7))
        returns datetime2
    AS
    -- written BY Bill Talada
    BEGIN
    DECLARE
        @filler varchar(27),
        @length int,
        @fixed datetime2

    SET @filler = 'cc00-01-01 00:00:00.0000000'
                --'ccyy-mm-dd hh:mm:ss.mmmmmmm'

    SET @length =
        CASE @precision
        WHEN 'century' THEN 2
        WHEN 'year' THEN 4
        WHEN 'month' THEN 7
        WHEN 'day' THEN 10
        WHEN 'hour' THEN 13
        WHEN 'minute' THEN 16
        WHEN 'second' THEN 19
        ELSE 0
        END

    IF @length = 0
        SET @fixed = @dt
    ELSE
        SET @fixed = cast(LEFT(CONVERT(varchar(27), @dt, 121),@length) + RIGHT(@filler,27-@length) AS datetime2)

        RETURN @fixed
    END
    go

    /*
    DECLARE @dt datetime2;
    SET @dt = SYSDATETIME();
    SELECT
        dbo.DateTime2Precision(@dt, 'century'),
        dbo.DateTime2Precision(@dt, 'year'),
        dbo.DateTime2Precision(@dt, 'month'),
        dbo.DateTime2Precision(@dt, 'day'),
        dbo.DateTime2Precision(@dt, 'hour'),
        dbo.DateTime2Precision(@dt, 'minute'),
        dbo.DateTime2Precision(@dt, 'second'),
        dbo.DateTime2Precision(@dt, '')
    ;
    */