Click here to monitor SSC
SQLServerCentral is supported by Red Gate Software Ltd.
 
Log in  ::  Register  ::  Not logged in
 
 
 
        
Home       Members    Calendar    Who's On


Add to briefcase

DateCeiling Function Expand / Collapse
Author
Message
Posted Saturday, November 27, 2010 12:05 PM
SSC Rookie

SSC RookieSSC RookieSSC RookieSSC RookieSSC RookieSSC RookieSSC RookieSSC Rookie

Group: General Forum Members
Last Login: Today @ 6:14 AM
Points: 26, Visits: 111
Comments posted to this topic are about the item DateCeiling Function
Post #1026993
Posted Sunday, November 28, 2010 9:45 PM
SSC Veteran

SSC VeteranSSC VeteranSSC VeteranSSC VeteranSSC VeteranSSC VeteranSSC VeteranSSC Veteran

Group: General Forum Members
Last Login: Sunday, May 26, 2013 9:33 PM
Points: 255, Visits: 278
A useful script, that is nearly there, but not quite.

select dbo.dateceiling('2010-11-29 18:00:00.000','hh')

should return 2010-11-29 18:00:00.000 in the same way that select ceiling(1.00) returns 1

However, it doesn't - it returns 2010-11-29 19:00:00.000

Looking at the code, the same would be true for minutes & seconds where the rest of the datetime was zero.

A small, but potentially important, bug.
Post #1027124
Posted Monday, November 29, 2010 8:07 AM
SSC Journeyman

SSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC Journeyman

Group: General Forum Members
Last Login: Tuesday, May 14, 2013 11:41 AM
Points: 77, Visits: 218
I feel it's easier truncating a CONVERT(..., ..., 121), then CASTing again and adding the unit if the two dates differ - you can easily add a flag for ceiling/truncating:

CREATE FUNCTION dbo.DATECEILING( @f1 AS datetime, @part AS varchar(2), @is_ceiling AS bit )
RETURNS datetime
AS
BEGIN
DECLARE @s1 varchar(21), @s2 varchar(21), @f2 datetime
select @s1 = REPLACE( CONVERT( varchar(23), @f1, 121 ), '-', '' )
IF @part = 'yy' SET @s2 = LEFT( @s1, 4 ) + '0101'
IF @part = 'mm' SET @s2 = LEFT( @s1, 6 ) + '01'
IF @part = 'dd' SET @s2 = LEFT( @s1, 8 )
IF @part = 'hh' SET @s2 = LEFT( @s1, 12 ) + '00:00'
IF @part = 'mi' SET @s2 = LEFT( @s1, 15 ) + '00'
IF @part = 'ss' SET @s2 = LEFT( @s1, 17 )

SET @f2 = CAST( @s2 as datetime )

IF @is_ceiling = 1 And @f1 > @f2
BEGIN
IF @part = 'yy' SET @f2 = DATEADD( year, 1, @f2 )
IF @part = 'mm' SET @f2 = DATEADD( month, 1, @f2 )
IF @part = 'dd' SET @f2 = DATEADD( day, 1, @f2 )
IF @part = 'hh' SET @f2 = DATEADD( hour, 1, @f2 )
IF @part = 'mi' SET @f2 = DATEADD( minute, 1, @f2 )
IF @part = 'ss' SET @f2 = DATEADD( second, 1, @f2 )
END
RETURN @f2
END

Post #1027362
« Prev Topic | Next Topic »

Add to briefcase

Permissions Expand / Collapse