if cast(SERVERPROPERTY('ProductVersion') as sysname) not like '11.%' begin begin try drop function dbo.EOMONTH end try begin catch -- dummy end catch go create function dbo.EOMONTH(@start_date datetime, @month_to_add int = 0) returns datetime as begin return dateadd(month,datediff(month,-1,@start_date) + @month_to_add, -1) end go end else print '-- Function EOMONTH() part of this SQL version' begin try drop function dbo.BOMONTH end try begin catch -- dummy end catch go create function dbo.BOMONTH(@start_date datetime, @month_to_add int = 0) returns datetime as begin return dateadd(day, 1, dbo.EOMONTH(@start_date, @month_to_add - 1 + @month_to_add)) end go begin try drop function dbo.DIMONTH end try begin catch -- dummy end catch go create function dbo.DIMONTH(@start_date datetime, @month_to_add int = 0) returns int as begin return datepart(day, dbo.EOMONTH(@start_date, @month_to_add)) end go begin try drop function dbo.BOWEEK end try begin catch -- dummy end catch go create function dbo.BOWEEK(@start_date datetime, @week_to_add int = 0) returns datetime as begin return dateadd(week,datediff(week,-1,@start_date) + @week_to_add,-1) end go begin try drop function dbo.EOWEEK end try begin catch -- dummy end catch go create function dbo.EOWEEK(@start_date datetime, @week_to_add int = 0) returns datetime as begin return dateadd(day, -1, dbo.BOWEEK(@start_date, @week_to_add + 1)) end go begin try drop function dbo.DATEFROMPARTS end try begin catch -- dummy end catch go create function dbo.DATEFROMPARTS(@year int, @month int, @day int) returns datetime as begin return dateadd(day, @day - 1, dateadd(month, @month - 1, dateadd(year, @year - 1900, 0))) end go begin try drop function dbo.DATETIMEFROMPARTS end try begin catch -- dummy end catch go create function dbo.DATETIMEFROMPARTS(@year int, @month int, @day int, @hour int, @minute int, @second int) returns datetime as begin return dateadd(second, @second, dateadd(minute, @minute, dateadd(hour, @hour, dateadd(day, @day - 1, dateadd(month, @month - 1, dateadd(year, @year - 1900, 0)))))) end go /* DEMO */ declare @mydate datetime set @mydate = getdate() select dbo.BOMONTH(@mydate,0) as begin_of_month, dbo.EOMONTH(@mydate,0) as end_of_month, dbo.DIMONTH(@mydate,0) as days_in_month, dbo.BOWEEK(@mydate,0) as begin_of_week, dbo.EOWEEK(@mydate,0) as end_of_week, dbo.BOWEEK(@mydate,1) as begin_of_next_week, dbo.EOWEEK(@mydate,1) as end_of_next_week, dbo.DATEFROMPARTS(2011,09,30) as datefromparts, dbo.DATETIMEFROMPARTS(2011,09,30,16,59,59) as datetimefromparts