 |
|
 |
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 |
| |
 |
Gracias
por
roger
Respuesta recibida el [07/10/2009 01:46:53]
|
 |
muy bueno el articulo. Una cuestion: ves algun problema en hacer el convert a string asi: SET @fechastring = CONVERT(varchar(10),@input, 112)??? y obtenerlo luego el date sin necesida de especificar el formato SET @fecha = CONVERT(datetime,@fechastring)
Muchas gracias
|
| |
 |
Si que hay un problema, estas ...
por
devjoker
Respuesta recibida el [07/10/2009 02:16:02]
|
 |
Si que hay un problema, estas convirtiendo @input a varchar con formato de salida 112.
Luego ese varchar deberias convertirlo con el mismo 112, ya que si el formato de la maquina es diferente al 112 se producirá un error en el caso de fecha invalida o quedará el dato erroneo que es lo peor que puede pasar.
SET @fecha = CONVERT(datetime,@fechastring, 112)
|
| |
 |
ansi
por
roger
Respuesta recibida el [07/10/2009 02:23:24]
|
 |
no, lo digo por ser el 112 formato ANSI que funciona independiente del lenguaje en el que se tenga configurada la BD
|
| |
 |
Si no recuerdo mal el código p...
por
devjoker
Respuesta recibida el [07/10/2009 04:14:00]
|
 |
Si no recuerdo mal el código para formato ANSI es 102 y 112 para ISO - lo he mirado :-) http://technet.microsoft.com/es-es/library/ms187928.aspx
El problema es radica siempre en lo mismo, lo que estamos haciendo es trabajar con strings pero representando fechas.
Cuando convertimos un string a datetime sql server - o cualquier base de datos y/o lenguaje - debe saber donde estan los dias, el año ... eso se lo decimos con el formato.
Si no le pasamos el formato, intentará realizar la conversion por si mismo - conversion implicita - en base al formato que tenga configurado la base de datos. No sé decirte a ciencia cierta si con una cadena de entrada en formato 112 vas a tener problemas con alguna configuracion - lo que si te puedo asegurar es que especificando el formato (en ambas conversiones!) no los tendras.
Mira este link: http://msdn.microsoft.com/es-es/library/ms180878.aspx
|
| |
 |
ok, muchas gracias. Fuera de t...
por
roger
Respuesta recibida el [08/10/2009 01:36:26]
|
 |
ok, muchas gracias. Fuera de tema, esta pagina si envia correos de notificaciones de los foros???, acostumbro revisarlos foros de C# ó asp.net pero cuando le contesto a las personas, luego no me llega notificacion de la respuesta de ellos.
|
| |
 |
Los foros envian notificacione...
por
devjoker
Respuesta recibida el [08/10/2009 03:15:29]
|
 |
Los foros envian notificaciones cuando el usuario así lo indica, pero no siempre llegan , cosas de los filtros anti-spam.
No es que desde devjoker haga spam ni mucho menos, sino que el servidor esta la india y muchos correo evitan todo el correo de ese pais (al menos esa es la escusa que me puso Pablo - http://www.devjoker.com/contenidos/Articulos/23/acercade.aspx -que es quien lleva el tema del servidor!).
|
| |
 |
yo haria esto
por
Frank Ludeña
Respuesta recibida el [09/10/2009 09:48:51]
|
 |
si quisiera obtener los registros de determinada fecha (por Ejemplo 10/10/2009), los obtendría a partir de la sigte consulta:
select Id,fecha_alta from Fecha where year(Fecha)=2009 and month(Fecha)=10 and day(Fecha)=10
Y si lo usara frecuentemente lo guardo en un procedure, pero esta bueno el artículo para saber un poco mas.
|
| |
 |
Hola Frank, lo que haces es pe...
por
Anónimo
Respuesta recibida el [09/10/2009 05:17:30]
|
 |
Hola Frank, lo que haces es perfectamente correcto - aunque mas costoso de cara a rendimiento - , pero para la gente que esta acostumbrada a ORACLE y a la funcion TRUNC le resultara "raro". Es una cuestion de comodidad y facilidad de uso.
|
| Añadir comentario ... |
Para preguntar utiliza los foros
|
|

|
Simular TRUNC en SQL Server |
|
Autor:
Pedro Herrarte Sánchez
|
|
Visitas:
1865 |
Fecha de publicación:
06/10/2009 |
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, bases de datos (SQL Server y ORACLE) e integración de sistemas.
Es experto en desarrollo (C#, ASP.NET, 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).
Es fundador, diseñador y programador de www.devjoker.com. |
|
|
Visitas:
87
|
Comentarios:
2
|
Archivo:
Articulos
|
Visitas:
792
|
Comentarios:
2
|
Archivo:
Articulos
|
Visitas:
742
|
Comentarios:
3
|
Archivo:
Articulos
|
Visitas:
652
|
Comentarios:
2
|
Archivo:
Articulos
|
Visitas:
3137
|
Comentarios:
2
|
Archivo:
Articulos
|
Visitas:
14494
|
Comentarios:
7
|
Archivo:
Articulos
|
Visitas:
1474
|
Comentarios:
3
|
Archivo:
Articulos
|
|
Visitas:
691
|
Comentarios:
2
|
Archivo:
Articulos
|
|
Visitas:
368
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
2007
|
Comentarios:
2
|
Archivo:
Articulos
|
|
|
 |
|
 |