viernes, 13 de diciembre de 2013

Simular TRUNC en SQL Server

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
ENDgo
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)

No hay comentarios.:

Publicar un comentario