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 datetimeAS 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 = 0WHILE (@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