Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Ayuda con fecha de sql server 2005

Estas en el tema de Ayuda con fecha de sql server 2005 en el foro de SQL Server en Foros del Web. Hola. Buscando en internet vi que las fechas se pueden comparar usando los operadores aritméticos, para saber si una fecha es menor, mayor o igual ...
  #1 (permalink)  
Antiguo 15/01/2009, 17:03
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 2 meses
Puntos: 0
Ayuda con fecha de sql server 2005

Hola. Buscando en internet vi que las fechas se pueden comparar usando los operadores aritméticos, para saber si una fecha es menor, mayor o igual a otra. Hice un programa para probarlo pero no funciona correctamente.
El formato de fecha que tengo es dma. Lo verifiqué con estas funciones:
SELECT MONTH( '01/05/2005' );
SELECT DAY( '01/05/2005' );
SELECT YEAR( '01/05/2005' );
Código:
IF '09/09/2009' > '02/02/2005'
	PRINT 'LA PRIMERA FECHA ES MAYOR'
ELSE
	PRINT 'LA SEGUNDA FECHA ES MAYOR O IGUAL
'

RESULTADO: LA PRIMERA FECHA ES MAYOR
Este caso funciona bien

Pero este no:
Código:
IF '01/09/2005' > '06/02/2005'
	PRINT 'LA PRIMERA FECHA ES MAYOR'
ELSE
	PRINT 'LA SEGUNDA FECHA ES MAYOR O IGUAL'
RESULTADO: LA SEGUNDA FECHA ES MAYOR O IGUAL
Al parecer si detecta que el dia es mayor en la segunda fecha, ignora los valores de los meses, cuando deberia de ser al revés. ¿Alguna sugerencia sobre cómo resolver esto?
  #2 (permalink)  
Antiguo 15/01/2009, 18:58
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 3 meses
Puntos: 38
Respuesta: Ayuda con fecha de sql server 2005

Existen funciones para realizar operaciones con fechas..

como datediff... checala en la ayuda de sql...

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 15/01/2009, 21:57
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 2 meses
Puntos: 0
Solucionado

En lo personal creo que sql server 2005 falla al no respetar el estàndar sql que especifica que debe de existir un tipo DATE y un tipo TIME por separado. En cambio, aglomera en un solo tipo ( datime o smalldatetime ) hora y fecha. También falla en no dar una función simple que sirva para este propósito específico que es tan necesario. Una función pequeña es una función màs eficiente. En este caso yo no necesito toda la potencia de una funciòn tan genèrica como DATEDIFF ( la cual devuelve la diferencia entre dos fechas, sòlo requiero saber si son iguales, o si una es mayor), asì que hice mi propia implementacion que regalo a quien la quiera usar:

El propòsito de esta función es comparar únicamente 2 fechas. Devuelve un 1 si la primera fecha es mayor, un -1 si la primera fecha es menor y un 0 si las fechas son iguales.

--
Código:
-- =============================================
-- Autor:		David Bernal Michelena 
-- Descripción:	Compara dos fechas, si la fecha1 es mayor devuelve un 1, si es menor devuelve un -1, si las fechas son iguales devuelve 0
-- =============================================
CREATE FUNCTION comparaFecha ( @fecha1 SMALLDATETIME, @fecha2 SMALLDATETIME )
RETURNS int
AS
BEGIN
	DECLARE @res int
  IF YEAR(@fecha1) > YEAR(@fecha2)	
     SET @res = 1
  ELSE
	IF YEAR (@fecha1) < YEAR(@fecha2)	
	SET @res =  -1
  ELSE -- AÑOS IGUALES
	IF MONTH(@fecha1) > MONTH(@fecha2)	
	SET @res =  1
	ELSE
	  IF MONTH(@fecha1) < MONTH(@fecha2)	
	  SET @res =  -1
	ELSE -- AÑOS Y MESES IGUALES
	  IF DAY(@fecha1) > DAY(@fecha2)
	  SET @res =  1
	  ELSE
		IF DAY(@fecha1) < DAY(@fecha2)
		SET @res =  -1
	  ELSE -- AÑOS, MESES Y DIAS IGUALES
		SET @res = 0
	RETURN @res
END
;
Para probar la funcion, usar el siguiente código:
Código:
DECLARE @fechaInicio SMALLDATETIME,
 @fechaFin SMALLDATETIME
SELECT @fechaInicio = '15/01/2009'
SELECT @fechaFin = '01/06/2009'
IF ( <usuario>.comparaFecha( @fechaInicio, @fechaFin) = 1)
	PRINT 'HAY UN ERROR'
ELSE
	PRINT 'CORRECTO, LA FECHA FINAL ES POSTERIOR O IGUAL A LA INICIAL'
En <usuario> deben de poner el nombre de usuario de la bd, si ponen sólo el nombre de la funcion, no funcionará.

Última edición por DavidBD; 09/02/2009 a las 18:43
  #4 (permalink)  
Antiguo 16/01/2009, 06:53
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 3 meses
Puntos: 38
En 2008

Gracias por el aporte David... y creo que te alegrara saber (si aun no lo sabes) que en la version 2008 ya tienes por separado estos tipos de datos...

SQL Server 2008: DATE, TIME, DATETIME2, DATETIMEOFFSET ...a la vista!‏

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #5 (permalink)  
Antiguo 16/01/2009, 08:03
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 8 meses
Puntos: 180
Respuesta: Ayuda con fecha de sql server 2005

Ademas de lo que bien comenta Andres95, ya hemos dicho mas de una vez, que TODOS LOS MOTORES de bases de datos (sin excepcion), manejan el formato ANSI para sus fechas (yyyymmdd hh:mm:ss, nnn), por tanto, las comparaciones de fechas deben hacerse en dicho formato, esto con el fin de no tener problemas en la escalabilidad de las bases.
  #6 (permalink)  
Antiguo 09/02/2009, 18:37
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Ayuda con fecha de sql server 2005

Sí Andres, eso fue lo que leí hace poco, sin embargo, las aplicaciones nuevas tienen errores y en el trabajo prefieren esperarse al menos un año antes de usar una aplicación nueva. El proyecto en el que trabajo empezó en septiembre de 2008.

iislas, en vez de repetir una serie de cosas "como lo has hecho más de una vez", deberías de escribir una solución ansi al problema planteado, así demostrarías que realmente eres un "colaborador" y así todos los lectores de este foro se podrían beneficiar, en vez de que ellos pierdan su tiempo leyendo algo que les resulta inútil. Te invito a que escribas la función en ansi para que todos nos beneficiemos. Saludos
  #7 (permalink)  
Antiguo 10/02/2009, 10:39
 
Fecha de Ingreso: junio-2008
Mensajes: 12
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Solucionado

hola necesito una funcion en sql que me de la diferencia entre dos fechas en meses y dias ejemplo 2009/02/02 - 2009/01/08 = 1mes y 6 dias
muchas gracias
  #8 (permalink)  
Antiguo 10/02/2009, 13:05
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 8 meses
Puntos: 180
Respuesta: Ayuda con fecha de sql server 2005

DavidBD

Si te tomas un poco de tiempo en leer mis aportes, te daras cuenta que soy un COLABORADOR, como tu lo llamas.

Por otro lado, ANSI, es un standar a NIVEL MUNDIAL para el manejo de fechas y es tan sencillo como comparar con este formato (YYYYMMDD HH:MM:SS, NNN).

WHERE colFecha >= '20080101'

¿Es tan dificil entender esto?
  #9 (permalink)  
Antiguo 10/02/2009, 13:15
Avatar de Fann_Lavigne  
Fecha de Ingreso: diciembre-2004
Mensajes: 622
Antigüedad: 19 años, 3 meses
Puntos: 12
Respuesta: Solucionado

Cita:
Iniciado por calegria Ver Mensaje
hola necesito una funcion en sql que me de la diferencia entre dos fechas en meses y dias ejemplo 2009/02/02 - 2009/01/08 = 1mes y 6 dias
muchas gracias
En este caso puede usar datediff, primero por meses y despues por dias, asi obtendras ambos datos.
__________________
"Entre Mas Brillante Es Una Mente, Tiene Que Luchar Contra Demonios Internos Mas Poderosos"
[email protected]
  #10 (permalink)  
Antiguo 11/02/2009, 08:22
 
Fecha de Ingreso: junio-2008
Mensajes: 12
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Solucionado

Cita:
Iniciado por Fann_Lavigne Ver Mensaje
En este caso puede usar datediff, primero por meses y despues por dias, asi obtendras ambos datos.
si e usado date diff pero me da la diferencia de los mese y la diferencia me da en dias totales es decir si pasaron 2 meses y 5 dias la respuesta es 66 dias dependiendo de los mese si uno tienen 30 dias y el otro 31 si los 2 tienes 31 aumentara entonces no tengo una referencia exacta de cunatos dias transcurrieron
  #11 (permalink)  
Antiguo 11/02/2009, 15:28
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 8 meses
Puntos: 180
Respuesta: Ayuda con fecha de sql server 2005

calegria

Esta funcion te calcula en AÑOS, MESES, DIAS, lo que ha trascurrido entre 2 fechas dadas.

Código:
CREATE FUNCTION EntreFechasAñoMesDia (@CadenaInicio as nvarchar(10), @CadenaFin as nvarchar(10)) 
RETURNS nvarchar (100)
AS 
BEGIN 

declare @AñoInicio int
declare @MesInicio int
declare @DiaInicio int
declare @AñoFin int
declare @MesFin int
declare @DiaFin int
declare @Años int
declare @Meses int
declare @Dias int
declare @FechaInicio datetime
declare @FechaFin datetime
declare @Texto nvarchar(100)
--Para comprobar las fechas
if isdate(@CadenaInicio)=0 return('La fecha de Inicio no es correcta')
if isdate(@CadenaFin)=0 return ('La fecha de Fin no es correcta')
if datediff(dd, @CadenaInicio, @CadenaFin) = 0 return('La fecha de Inicio es igual que la de Fin')
--Asigna las cadenas a las fechas, inviertiéndolas si es necesario y cambiando el mensaje de salida.-
if datediff(dd, @CadenaInicio, @CadenaFin) > 0
begin
set @FechaInicio = @CadenaInicio
set @FechaFin = @CadenaFin
set @Texto = 'Pasa'
end
else
begin
set @FechaInicio = @CadenaFin
set @FechaFin = @CadenaInicio
set @Texto = 'Falta'
end 
--Asigna los valores individuales de día, mes y año, para hacer los cálculos.-
set @DiaInicio = day(@FechaInicio)
set @MesInicio = month(@FechaInicio)
set @AñoInicio = year(@FechaInicio)

set @DiaFin = day(@FechaFin)
set @MesFin = month(@FechaFin)
set @AñoFin = year(@FechaFin)


--Comprueba si el día es menor o igual al de fin.-
if @DiaFin - @DiaInicio >= 0 
begin
set @Dias = @DiaFin - @DiaInicio
end
--Si no, calcula la suma en días, desde el día de Inicio a fin de mes, mas los días de Fin, y le resta uno al mes de Fin.-
else
begin
set @Dias = (day(dateadd(mm,1,cast(('01/' + str(@MesInicio) + '/' + str(@AñoInicio)) as datetime)) - 1 )- @DiaInicio) + @DiaFin
set @MesFin = @MesFin - 1
end
--Lo mismo con el mes.-
if @MesFin - @MesInicio >= 0 
begin
set @Meses = @MesFin - @MesInicio

end
else

begin
set @Meses = (@MesFin - @MesInicio) + 12
set @AñoFin = @AñoFin - 1
end

set @Años = @AñoFin - @AñoInicio
--A partir de qaquí ya tenemos los vlores del año, mes y día, lo siguiente es para presentarlo correctamente.-
declare @CadDia as varchar(20)
declare @CadMes as varchar(20)
declare @CadAño as varchar(20)

if @Dias = 0 set @CadDia = ''
if @Dias = 1 set @CadDia = ltrim(str(@Dias)) + ' día '
if @Dias > 1 set @CadDia = ltrim(str(@Dias)) + ' días '

if @Meses = 0 set @CadMes = ''
if @Meses = 1 set @CadMes = ltrim(str(@Meses)) + ' mes'
if @Meses > 1 set @CadMes = ltrim(str(@Meses)) + ' meses'


if @Años = 0
begin
set @CadAño = ''
if @Meses > 1 set @Texto = @Texto + 'n'
if @Meses = 0 and @Dias >1 set @Texto = @Texto + 'n'
end
if @Años = 1 set @CadAño = ltrim(str(@Años)) + ' año'
if @Años > 1
begin
set @CadAño = ltrim(str(@Años)) + ' años'
set @Texto = @Texto + 'n'
end

if @Meses <> 0 
begin
if @Dias <> 0 
begin
set @CadMes = @CadMes + ' y '
if @Años <> 0 set @CadAño = @CadAño + ', '
end
else
if @Años <> 0 set @CadAño = @CadAño + ' y '
end
else
if @Años <> 0 and @Dias <> 0 set @CadMes = @CadMes + ' y ' 
--end

Set @Texto = @Texto + ' ' + @CadAño + @CadMes + @CadDia
RETURN @Texto
END
  #12 (permalink)  
Antiguo 11/02/2009, 19:41
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Ayuda con fecha de sql server 2005

Islas, si supieras una pisca de ingeniería de software, sabrías que no todos los sistemas necesitan cumplir con requisito de escalabilidad, pues este se define en la parte de requerimientos no funcionales de un sistema, como lo marcan metodologías de desarrollo de software como RUP, que posiblemente no conozcas.
En cuanto a tu código, me resulta impresionante que a estas alturas haya programadores que no usen indentaciones. Usar indentaciones es una buena práctica porque mejora la legibilidad y la claridad de un programa ( y no me salgas con una respuesta lamer como .... ·pero pues mientras funcione· o ·mientras yo me entienda"), eso se enseña en el curso 1 de programación estructurada. ¡Qué barbaro!

Además, con respecto a tu comentario de la comparación ANSI de las fechas, te informo que las funciones de SQL Server Year, Day y Month que son las que uso, trabajan con el formato ANSI implicitamente. Sugerencia: si la rueda ya existe no la reinventes, mejor úsala. También te informó que estas funciones son del sistema y reciben una fecha en formato válido, incluyendo por supuesto el ANSI. Estas funciones seguirán presentes en versiones posteriores de SQL Server por lo cual no se afecta la escalabilidad. Chécalo, ¿ok?, y usa buenas prácticas de programación para la próxima.

Última edición por DavidBD; 11/02/2009 a las 20:03
  #13 (permalink)  
Antiguo 11/02/2009, 20:34
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 8 meses
Puntos: 180
Respuesta: Ayuda con fecha de sql server 2005

Creo que ya hace falta un moderador en este tema................
  #14 (permalink)  
Antiguo 12/02/2009, 08:18
 
Fecha de Ingreso: junio-2008
Mensajes: 12
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Ayuda con fecha de sql server 2005

hola iisla gracias por la funcion ahora me toca modificarla por que solo deseoa la respuesta en meses y dias.

[QUOTE=iislas;2786039]calegria

Esta funcion te calcula en AÑOS, MESES, DIAS, lo que ha trascurrido entre 2 fechas dadas.

[code]
CREATE FUNCTION EntreFechasAñoMesDia
  #15 (permalink)  
Antiguo 12/03/2009, 20:56
 
Fecha de Ingreso: marzo-2009
Mensajes: 117
Antigüedad: 15 años
Puntos: 2
Respuesta: Ayuda con fecha de sql server 2005

hola amigos se que no es el lugar pero necesito ayuda para crear una base de datos en sql server 2005

amigos yo instale sql server 2005 y noc crear un base de datos creo que lo mas cerk q he stado es cuando entro en la parte de "teplate explorer" me aparecen 3 iconos que son sql server, analysis server,sql mobile,
cuado entro en la opcion sql mobile estan sql mobile templates---> data base
index
table
al entrar en data base---> create data base
aparece una ventana con: server type: sql server mobile
data base file: C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\base de datps\MyDatabase#1.sdf
authentication:sql moble authentication
login:
password: esta se la coloco yo.....
luego pulso conectar y me aparece el siguiente comando:
-- =============================================
-- Basic Create Database Template
-- =============================================
CREATE DATABASE "<database_name, sysname, your_database_name>";
  #16 (permalink)  
Antiguo 22/01/2011, 18:59
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Ayuda con fecha de sql server 2005

¿Qué tal te fue con tu base de datos newnovato?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:40.