Periodos entre fechas

07/02/2005 - 11:43 por Joan Q. | Informe spam
Hola a todos,



Hace un tiempo hice una consulta que fue amablemente contestada en su
momento por Javier Loria (gracias Javier) sobre diferencia entre 2 fechas
expresada en año, meses y días. La solución dada por Javier era



DECLARE @FechaInicial SMALLDATETIME
DECLARE @FechaFinal SMALLDATETIME
SET @FechaInicial = '20010101'
SET @FechaFinal = '20040227'

SELECT @FechaInicial AS FechaInicial
, @FechaFinal AS FechaFinal
, DATEDIFF(year, @FechaInicial , @FechaFinal) AS AnosDiferencia
, DATEDIFF(month,DATEADD(year,
DATEDIFF(year, @FechaInicial , @FechaFinal), @FechaInicial),
@FechaFinal)
AS MesesDiferencia
, DATEDIFF(day,DATEADD(month,
DATEDIFF(month, @FechaInicial , @FechaFinal), @FechaInicial),
@FechaFinal)
AS DiasDiferencia



Si el mes de @fechainicial es anterior al de @fechafinal funciona, al revés
ya no.



Lo que me sorprende es que la funcion datediff(year, @fechainicial,
@fechafinal) sencillamente coge la parte del año de @fechainicial y la
compara con la parte del año de @fechafinal: esto no es determinar la
diferencia en años entre 2 fechas.



Bueno, había pensado



convert(int, (datediff(day, @fechainicial, @fechafinal))/364.5 )as
AnosDiferencia,

convert(int, (datediff(month, @fechainicial, @fechafinal) - (convert(int,
(datediff(day, @fechainicial, @fechafinal))/364.5 )* 12)))as
MesesDiferencia,

day(@fechafinal) - day(@fechainicial) as DiasDiferencia



Queda un poco patatero, pero creo ahora funciona



Joan Q

Preguntas similare

Leer las respuestas

#1 Joan Q.
07/02/2005 - 13:23 | Informe spam
Pues los días no me salen

"Joan Q." escribió en el mensaje
news:
Hola a todos,



Hace un tiempo hice una consulta que fue amablemente contestada en su
momento por Javier Loria (gracias Javier) sobre diferencia entre 2 fechas
expresada en año, meses y días. La solución dada por Javier era



DECLARE @FechaInicial SMALLDATETIME
DECLARE @FechaFinal SMALLDATETIME
SET @FechaInicial = '20010101'
SET @FechaFinal = '20040227'

SELECT @FechaInicial AS FechaInicial
, @FechaFinal AS FechaFinal
, DATEDIFF(year, @FechaInicial , @FechaFinal) AS AnosDiferencia
, DATEDIFF(month,DATEADD(year,
DATEDIFF(year, @FechaInicial , @FechaFinal), @FechaInicial),
@FechaFinal)
AS MesesDiferencia
, DATEDIFF(day,DATEADD(month,
DATEDIFF(month, @FechaInicial , @FechaFinal), @FechaInicial),
@FechaFinal)
AS DiasDiferencia



Si el mes de @fechainicial es anterior al de @fechafinal funciona, al


revés
ya no.



Lo que me sorprende es que la funcion datediff(year, @fechainicial,
@fechafinal) sencillamente coge la parte del año de @fechainicial y la
compara con la parte del año de @fechafinal: esto no es determinar la
diferencia en años entre 2 fechas.



Bueno, había pensado



convert(int, (datediff(day, @fechainicial, @fechafinal))/364.5 )as
AnosDiferencia,

convert(int, (datediff(month, @fechainicial, @fechafinal) - (convert(int,
(datediff(day, @fechainicial, @fechafinal))/364.5 )* 12)))as
MesesDiferencia,

day(@fechafinal) - day(@fechainicial) as DiasDiferencia



Queda un poco patatero, pero creo ahora funciona



Joan Q


Respuesta Responder a este mensaje
#2 ulises
08/02/2005 - 04:53 | Informe spam
La lógica de Javier es correcta, el problema, como bien dices, es que
DATEDIFF te redondea la diferencia, es decir la diferencia entre el
20010401 y el 20040101 es de 3 años cuando en realidad es de 2 años
más meses, en el SELECT tendría que hacerse una corrección en todos
los DATEDIFF para restar uno en los años cuando el mes final es menor
que el mes inicial o si son iguales cuando el día final es menor que
el día final, y en el caso de los meses cuando el día final es menor
que el día inicial, algo como :

DECLARE @FechaInicial SMALLDATETIME
DECLARE @FechaFinal SMALLDATETIME
SET @FechaInicial = '20010227'
SET @FechaFinal = '20040102'
SELECT @FechaInicial AS FechaInicial ,
@FechaFinal AS FechaFinal ,
CASE WHEN MONTH(@FechaFinal) < MONTH(@fechaInicial) OR
MONTH(@FechaFinal) = MONTH(@fechaInicial) AND
DAY(@FechaFinal) < DAY(@fechaInicial) THEN -1 ELSE 0
END +
DATEDIFF(year, @FechaInicial , @FechaFinal) AS AnosDiferencia
,
CASE WHEN DAY(@FechaFinal) < DAY(@fechaInicial) THEN -1 ELSE 0
END +
DATEDIFF(month,
DATEADD(year,
CASE WHEN MONTH(@FechaFinal) <
MONTH(@fechaInicial) OR
MONTH(@FechaFinal) MONTH(@fechaInicial) AND
DAY(@FechaFinal) <
DAY(@fechaInicial) THEN -1 ELSE 0 END +
DATEDIFF(year, @FechaInicial , @FechaFinal),
@FechaInicial),
@FechaFinal) AS MesesDiferencia ,
DATEDIFF(day,
DATEADD(month,
CASE WHEN DAY(@FechaFinal) <
DAY(@fechaInicial) THEN -1 ELSE 0 END +
DATEDIFF(month, @FechaInicial , @FechaFinal),
@FechaInicial),
@FechaFinal) AS DiasDiferencial

resultado :

FechaInicial FechaFinal
AnosDiferencia MesesDiferencia DiasDiferencial


2001-02-27 00:00:00 2004-01-02
00:00:00 2 10
6

(1 row(s) affected)

Saludos,
Ulises

On Mon, 7 Feb 2005 13:23:10 +0100, "Joan Q."
wrote:

Pues los días no me salen

"Joan Q." escribió en el mensaje
news:
Hola a todos,



Hace un tiempo hice una consulta que fue amablemente contestada en su
momento por Javier Loria (gracias Javier) sobre diferencia entre 2 fechas
expresada en año, meses y días. La solución dada por Javier era



DECLARE @FechaInicial SMALLDATETIME
DECLARE @FechaFinal SMALLDATETIME
SET @FechaInicial = '20010101'
SET @FechaFinal = '20040227'

SELECT @FechaInicial AS FechaInicial
, @FechaFinal AS FechaFinal
, DATEDIFF(year, @FechaInicial , @FechaFinal) AS AnosDiferencia
, DATEDIFF(month,DATEADD(year,
DATEDIFF(year, @FechaInicial , @FechaFinal), @FechaInicial),
@FechaFinal)
AS MesesDiferencia
, DATEDIFF(day,DATEADD(month,
DATEDIFF(month, @FechaInicial , @FechaFinal), @FechaInicial),
@FechaFinal)
AS DiasDiferencia



Si el mes de @fechainicial es anterior al de @fechafinal funciona, al


revés
ya no.



Lo que me sorprende es que la funcion datediff(year, @fechainicial,
@fechafinal) sencillamente coge la parte del año de @fechainicial y la
compara con la parte del año de @fechafinal: esto no es determinar la
diferencia en años entre 2 fechas.



Bueno, había pensado



convert(int, (datediff(day, @fechainicial, @fechafinal))/364.5 )as
AnosDiferencia,

convert(int, (datediff(month, @fechainicial, @fechafinal) - (convert(int,
(datediff(day, @fechainicial, @fechafinal))/364.5 )* 12)))as
MesesDiferencia,

day(@fechafinal) - day(@fechainicial) as DiasDiferencia



Queda un poco patatero, pero creo ahora funciona



Joan Q





Respuesta Responder a este mensaje
#3 Joan Q.
08/02/2005 - 09:13 | Informe spam
Muchas gracias por tu respuesta
JoanQ
"ulises" escribió en el mensaje
news:
La lógica de Javier es correcta, el problema, como bien dices, es que
DATEDIFF te redondea la diferencia, es decir la diferencia entre el
20010401 y el 20040101 es de 3 años cuando en realidad es de 2 años
más meses, en el SELECT tendría que hacerse una corrección en todos
los DATEDIFF para restar uno en los años cuando el mes final es menor
que el mes inicial o si son iguales cuando el día final es menor que
el día final, y en el caso de los meses cuando el día final es menor
que el día inicial, algo como :

DECLARE @FechaInicial SMALLDATETIME
DECLARE @FechaFinal SMALLDATETIME
SET @FechaInicial = '20010227'
SET @FechaFinal = '20040102'
SELECT @FechaInicial AS FechaInicial ,
@FechaFinal AS FechaFinal ,
CASE WHEN MONTH(@FechaFinal) < MONTH(@fechaInicial) OR
MONTH(@FechaFinal) = MONTH(@fechaInicial) AND
DAY(@FechaFinal) < DAY(@fechaInicial) THEN -1 ELSE 0
END +
DATEDIFF(year, @FechaInicial , @FechaFinal) AS AnosDiferencia
,
CASE WHEN DAY(@FechaFinal) < DAY(@fechaInicial) THEN -1 ELSE 0
END +
DATEDIFF(month,
DATEADD(year,
CASE WHEN MONTH(@FechaFinal) <
MONTH(@fechaInicial) OR
MONTH(@FechaFinal) > MONTH(@fechaInicial) AND
DAY(@FechaFinal) <
DAY(@fechaInicial) THEN -1 ELSE 0 END +
DATEDIFF(year, @FechaInicial , @FechaFinal),
@FechaInicial),
@FechaFinal) AS MesesDiferencia ,
DATEDIFF(day,
DATEADD(month,
CASE WHEN DAY(@FechaFinal) <
DAY(@fechaInicial) THEN -1 ELSE 0 END +
DATEDIFF(month, @FechaInicial , @FechaFinal),
@FechaInicial),
@FechaFinal) AS DiasDiferencial

resultado :

FechaInicial FechaFinal
AnosDiferencia MesesDiferencia DiasDiferencial


2001-02-27 00:00:00 2004-01-02
00:00:00 2 10
6

(1 row(s) affected)

Saludos,
Ulises

On Mon, 7 Feb 2005 13:23:10 +0100, "Joan Q."
wrote:

>Pues los días no me salen
>
>"Joan Q." escribió en el mensaje
>news:
>> Hola a todos,
>>
>>
>>
>> Hace un tiempo hice una consulta que fue amablemente contestada en su
>> momento por Javier Loria (gracias Javier) sobre diferencia entre 2


fechas
>> expresada en año, meses y días. La solución dada por Javier era
>>
>>
>>
>> DECLARE @FechaInicial SMALLDATETIME
>> DECLARE @FechaFinal SMALLDATETIME
>> SET @FechaInicial = '20010101'
>> SET @FechaFinal = '20040227'
>>
>> SELECT @FechaInicial AS FechaInicial
>> , @FechaFinal AS FechaFinal
>> , DATEDIFF(year, @FechaInicial , @FechaFinal) AS AnosDiferencia
>> , DATEDIFF(month,DATEADD(year,
>> DATEDIFF(year, @FechaInicial , @FechaFinal), @FechaInicial),
>> @FechaFinal)
>> AS MesesDiferencia
>> , DATEDIFF(day,DATEADD(month,
>> DATEDIFF(month, @FechaInicial , @FechaFinal), @FechaInicial),
>> @FechaFinal)
>> AS DiasDiferencia
>>
>>
>>
>> Si el mes de @fechainicial es anterior al de @fechafinal funciona, al
>revés
>> ya no.
>>
>>
>>
>> Lo que me sorprende es que la funcion datediff(year, @fechainicial,
>> @fechafinal) sencillamente coge la parte del año de @fechainicial y la
>> compara con la parte del año de @fechafinal: esto no es determinar la
>> diferencia en años entre 2 fechas.
>>
>>
>>
>> Bueno, había pensado
>>
>>
>>
>> convert(int, (datediff(day, @fechainicial, @fechafinal))/364.5 )as
>> AnosDiferencia,
>>
>> convert(int, (datediff(month, @fechainicial, @fechafinal) -


(convert(int,
>> (datediff(day, @fechainicial, @fechafinal))/364.5 )* 12)))as
>> MesesDiferencia,
>>
>> day(@fechafinal) - day(@fechainicial) as DiasDiferencia
>>
>>
>>
>> Queda un poco patatero, pero creo ahora funciona
>>
>>
>>
>> Joan Q
>>
>>
>

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida