When creating a report often the date column provides more detail than we need to see. Here is a handy little UDF that rounds a DATETIME column to either the MINUTE, HOUR, DAY, WEEK or MONTH.
DateFirst UDF
IF OBJECT_ID('dbo.udfDateFirst') IS NOT NULL
DROP FUNCTION dbo.udfDateFirst
GO
CREATE FUNCTION dbo.udfDateFirst
(
@interval VARCHAR(10),
@rawDate DATETIME
)
RETURNS DATETIME
AS
BEGIN
-- Remove seconds for allintervals
SET @rawDate = CAST(@rawDate AS SMALLDATETIME)
IF @interval = 'MINUTE'
RETURN @rawDate
ELSE -- strip off minutes
SET @rawDate = DATEADD(minute,-1 * DATEPART(minute,@rawDate),@rawDate)
IF @interval = 'HOUR'
RETURN @rawDate
ELSE -- strip off hours
SET @rawDate = DATEADD(hour, -1 * DATEPART(hour,@rawDate),@rawDate)
IF @interval = 'DAY'
RETURN @rawDate
IF @interval = 'WEEK'
RETURN DATEADD(day, -1 * DATEPART(weekday,@rawDate),@rawDate)
-- move date to first of month
SET @rawDate = DATEADD(day, -1 * DATEPART(day,@rawDate) + 1,@rawDate)
IF @interval = 'MONTH'
RETURN @rawDate
-- move Date to first of year
SET @rawDate = DATEADD(month, -1 * DATEPART(month,@rawDate)+1 , @rawDate)
RETURN @rawDate
END
Test Query
DECLARE @now AS DATETIME
SET @now = getDate()
SELECT dbo.udfDateFirst('MINUTE',@now)
SELECT dbo.udfDateFirst('HOUR',@now)
SELECT dbo.udfDateFirst('DAY',@now)
SELECT dbo.udfDateFirst('WEEK',@now)
SELECT dbo.udfDateFirst('MONTH',@now)
SELECT dbo.udfDateFirst('YEAR',@now)Labels: Dates, SQL, UDF