Simular TRUNC en SQL Server

TRUNC es una funcion de PL/SQL muy popular en el mundo ORACLE, recibe una fecha con hora y la devuelve truncada a las 00:00:00.

Es decir si se pasa como parametro 25/08/2009 19:45:23 devuelve 25/08/2009 00:00:00.

Personalmente me parece una función extremadamente util - por ejemplo para obtener los registros correspondientes a un dia  concreto o rango de fechas- , pero que inexplicablemente SQL Server no incorpora de forma nativa esta función, aunque el problema se mitiga gracias a los nuevos tipos de datos de SQL Server 2008 para fechas.

Por supuesto no es dificil obtener realizar este tipo de consultas. Normalmente los programadores recurren a las funciones CAST y CONVERT para realizar este tipo de consultas. Esta forma de trabajar es propensa a errores, sobre todo de localizacion, por no hablar de aquellos que confian en la coversion implicita ...  Yo siempre recomiendo trabajar de forma tipada - es decir con variables datetime. 

Para conseguir el mismo resultado que nos da la funcion TRUNC podemos utilizar este simple script, donde convertimos la fecha - en este caso getdate() - al tipo varchar(10) para truncar el resto de caracteres (el tiempo), posteriormente volvemos a convertir a fecha para obtener una nueva fecha.

 

DECLARE @fecha datetime,

@fechastring varchar(10)

SET @fechastring = CONVERT(varchar(10),getdate(), 103)

SET @fecha = CONVERT(datetime, @fechastring, 103)

 

SELECT @fecha

 

SELECT [<campos>]

FROM [<tabla>]

WHERE [<campo_fecha>] > @fecha

Es importante que el formato sea el mismo es la dos conversiones, a  varchar y a datetime.

Pero como hemos dicho la recomendacion es trabajar siempre de forma tipada, por lo que podemes crear una funcion UDF.

 

CREATE FUNCTION dbo.trunc (@input datetime)

RETURNS datetime

AS

BEGIN

DECLARE @fecha datetime,

@fechastring varchar(10)

SET @fechastring = CONVERT(varchar(10),@input, 103)

SET @fecha = CONVERT(datetime, @fechastring, 103)

RETURN @fecha

END

Este sencillo ejemplo muestra como podríamos utilizar la funcion.

 

CREATE TABLE FechaSample

(

id int IDENTITY PRIMARY KEY,

fecha_alta datetime

)

 

go

 

DECLARE @i int,

@j int ,

@f datetime

SET @j = 0

WHILE (@j < 10)

BEGIN

SET @f = getdate() + @j

SET @i = 0

WHILE (@i < 10)

BEGIN

INSERT INTO Fechasample

( fecha_alta)

VALUES

(@f)

SET @i = @i + 1

END

SET @j = @j + 1

END

go

 

SELECT * FROM fechaSample

WHERE

fecha_alta between dbo.trunc(getdate())

AND dbo.trunc(getdate() + 1)

Obtendriamos el siguiente resultado:

id fecha_alta

--- -----------------------

1 2009-10-06 12:21:45.587

2 2009-10-06 12:21:45.587

3 2009-10-06 12:21:45.587

4 2009-10-06 12:21:45.587

5 2009-10-06 12:21:45.587

6 2009-10-06 12:21:45.587

7 2009-10-06 12:21:45.587

8 2009-10-06 12:21:45.587

9 2009-10-06 12:21:45.587

10 2009-10-06 12:21:45.587

 

(10 row(s) affected)

Como siempre, cuando realizamos conversiones en una base de datos hay que tener en cuenta que si convertimos una columna, no solo tendremos un coste adicional de procesamiento sino que ademas dejaremos de utilizar los indices que pudieran estar definidos para el campo. Tenedlo en cuenta.

Saludos,

DJK

Pedro  Herrarte  Sánchez
Simular TRUNC en SQL Server
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:06/10/2009
Última actualizacion:06/10/2009
Visitas totales:26327
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com