InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
Cómo insertar un fichero .xml en un campo de tipo XML de SQL server 2005 o 2008
SET IDENTITY_INSERT ON y LinqToSQL
SQL Server 2008
LinQ To SQL - Un ejemplo sencillo
Formatear números en SQL Server
Leer un campo XML de SQL Server 2005 con C#
SQL dinámico en Transact SQL
Cursores en Transact SQL
Triggers en Transact SQL
Funciones en Transact SQL


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


 Versión para imprimir  Foros de consulta

 
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
Autor:

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

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
02/02/2010 iPad vs Telesketch
Visitas: 792 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 742 | Comentarios: 3 | Archivo: Articulos
Visitas: 3137 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14494 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1474 | Comentarios: 3 | Archivo: Articulos
Visitas: 691 | Comentarios: 2 | Archivo: Articulos
Visitas: 368 | Comentarios: 0 | Archivo: Articulos
Visitas: 2007 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
quiero saber en que entidad estoy afiliada a cesantias y pensiones por adriana ... [WIN 98/NT/2000/XP] 23 28/11/2009
Certificado de afiliacion Pensiones y Cesantias por VIVIANA ... [Actualidad] 1 10/03/2010
certificado de pensiones del bbva horizonte por danger ... [Actualidad] 122 12/01/2010
CERTIFICADO por LIZETH ... [Actualidad] 0 11/03/2010
certificado de afiliación de pensiones y cesantias por secre ... [Actualidad] 111 28/01/2010
Solicitud certificado de afiliaciones a pensiones y cesantias proteccion por hz ... [Actualidad] 54 10/02/2010
certificado pensiones horizonte por angela patricia rodriguez ... [Actualidad] 135 26/01/2010
pensiones por eduard ... [Visual Basic 6.0] 0 11/03/2010
Manual Visual Studio.NET por Shiko ... [Visual Basic .NET] 41 26/10/2006
cap de setmana genial por ramón ... [Java] 0 11/03/2010
cetificado de pension por RICARDDO RAFAEL SOLANO ORZCO ... [Actualidad] 0 11/03/2010
solicitud de aifiliacion a porvernir por julios ... [Actualidad] 2 11/03/2010

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
22/10/2005 Indices    forma parte de...Tutorial SQL
22/10/2005 Tablas    forma parte de...Tutorial SQL
07/11/2006 Enumeraciones    forma parte de...Tutorial C#
22/10/2005 Actualización de datos. UPDATE    forma parte de...Tutorial SQL
01/01/2006 Borrado de datos. DELETE    forma parte de...Tutorial SQL
28/06/2006 Propagacion de excepciones en PL/SQL    forma parte de...Tutorial PL/SQL
28/06/2006 Procedimientos almacenados en PL/SQL    forma parte de...Tutorial PL/SQL
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
05/12/2006 Manipulación de punteros    forma parte de...Tutorial C#
24/07/2006 SQL Dinamico    forma parte de...Tutorial PL/SQL

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]