I know this is old, but I've always been doing Dynamic SQL to make the dateadd function accept a parameter. Well today a different route clicked so I made a function to knock it out for me.
This way I can call it like so
declare @datepart_vc varchar(20)
set @datepart_vc = 'day'
select dbo.Dateadd2(@datepart_vc,1,getdate())
Function
CREATE FUNCTION dbo.DateAdd2
(
-- Add the parameters for the function here
@DatePart_VC VARCHAR(20)
, @Number_IN INT
, @Date_DT DATETIME
)
RETURNS DATETIME
AS
BEGIN
-- Declare the return variable here
DECLARE @Return_DT AS DATETIME
-- Add the T-SQL statements to compute the return value here
SELECT @Return_DT = (
CASE
WHEN @DatePart_VC = 'year' THEN DATEADD(year,@Number_IN,@Date_DT)
WHEN @DatePart_VC = 'quarter' THEN DATEADD(quarter,@Number_IN,@Date_DT)
WHEN @DatePart_VC = 'month' THEN DATEADD(month,@Number_IN,@Date_DT)
WHEN @DatePart_VC = 'dayofyear' THEN DATEADD(dayofyear,@Number_IN,@Date_DT)
WHEN @DatePart_VC = 'day' THEN DATEADD(day,@Number_IN,@Date_DT)
WHEN @DatePart_VC = 'week' THEN DATEADD(week,@Number_IN,@Date_DT)
WHEN @DatePart_VC = 'weekday' THEN DATEADD(weekday,@Number_IN,@Date_DT)
WHEN @DatePart_VC = 'hour' THEN DATEADD(hour,@Number_IN,@Date_DT)
WHEN @DatePart_VC = 'minute' THEN DATEADD(minute,@Number_IN,@Date_DT)
WHEN @DatePart_VC = 'second' THEN DATEADD(second,@Number_IN,@Date_DT)
--WHEN @DatePart_VC = 'millisecond' THEN DATEADD(millisecond,@Number_IN,@Date_DT)
--WHEN @DatePart_VC = 'microsecond' THEN DATEADD(microsecond,@Number_IN,@Date_DT)
--WHEN @DatePart_VC = 'nanosecond' THEN DATEADD(nanosecond,@Number_IN,@Date_DT)
END
)
-- Return the result of the function
RETURN @Return_DT