Para la conferencia de Pass Alemania, donde presento la sesión “Empower your users with an OUTSTANDING Time Dimension” escribí las siguientes funciones de fecha, que obtienen el primer y último día de un mes, trimestre o año, hay que tener cuidado de donde las usas para no estropear el desempeño:
CREATE FUNCTION FirstDayOf (@Date SMALLDATETIME, @Period VARCHAR(10) )
— Must not have hour or minute
RETURNS SMALLDATETIME
AS
BEGIN
— @Date Must not have hours or minutes
— @Period IN (‘Month’, ‘Quarter’, ‘Year’)
RETURN
CASE @Period
WHEN ‘Month’ THEN DATEADD(DD, 1 – DAY(@Date), @Date)
WHEN ‘Quarter’ THEN DATEADD(Month, 1– MONTH(@Date)
+ (3*(DATEPART(Quarter, @Date)-1))
, DATEADD(DD, 1 – DAY(@Date), @Date))
WHEN ‘Year’ THEN DATEADD(Month, 1–MONTH(@Date), DATEADD(DD, 1 – DAY(@Date), @Date))
END
END
GO
CREATE FUNCTION LastDayOf(@Date SMALLDATETIME, @Period VARCHAR(10) )
RETURNS SMALLDATETIME
AS
BEGIN
— @Date Must not have hours or minutes
— @Period IN (‘Month’, ‘Quarter’, ‘Year’)
RETURN
CASE @Period
WHEN ‘Month’ THEN DATEADD(DD, –1, DATEADD(Month, 1,dbo.FirstDayOf(@Date, ‘Month’)))
WHEN ‘Quarter’ THEN DATEADD(DD, –1, DATEADD(Month, 3,dbo.FirstDayOf(@Date, ‘Quarter’)))
WHEN ‘Year’ THEN DATEADD(DD, –1, DATEADD(YEAR, 1,dbo.FirstDayOf(@Date, ‘Year’)))
END
END
go