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, '')
;
*/