Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-12-2008
Avatar de paladincubano
paladincubano paladincubano is offline
Miembro
 
Registrado: jul 2007
Posts: 147
Poder: 17
paladincubano Va por buen camino
Como llevo esto a delphi?

Hola foreros.
Tengo esta funcion en SQL:

DATEPART(week, fecha_nac) - DATEPART(week, DATEADD(month, DATEDIFF(month, 0, fecha_nac), 0))+1

La cual me devuelve el numero de semana del MES que esta en el campo Fecha_Nac.
Me gustaria llevar esa funcion a Delphi, como seria???

OJO: He usado la funcion de DateUtils.WeekOfTheMonth pero hay algunos valores que no me coinciden con lo de la consulta, he visto de todo, he encontrado miles pero ninguna nunca me coincide con la de DateUtils, por eso quiero hacer mi propia funcion en delphi que siga la misma sintaxis de la consulta en SQL para que me coincida tanto la consulta como la funcion en delphi. me entienden?
Muchas gracias y me urge un poco por favor.

function MyWeekOfTheMonth(Date: TDate): Integer
begin
...
...
result := ???;
end;
Responder Con Cita
  #2  
Antiguo 03-12-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Esta es la definición de WeekOfTheMonth:
Código Delphi [-]
function WeekOfTheMonth(const AValue: TDateTime): Word; overload;
function WeekOfTheMonth(const AValue: TDateTime; var AYear, AMonth: Word): Word; overload;
En la función que quieres crear, deberías tener en cuenta AYear y AMonth. Esto te devuelve el año y el mes en el que empieza la semana. Por lo tanto, comparando el año y el mes de la fecha con los que te devuelve puedes saber que la semana que contiene esa fecha pertenece al principio del mes siguiente o al final de mes anterior.
Ejemplo:
El 1 de julio de 2008 fue martes -- primera semana de julio.
El 30 de junio fue lunes -- pertenece a la primera semana de julio.

No se que es exactamente lo que te devuelve datepart.
También deberías hechar un vistazo a WeekOf - devuelve un valor de 1 a 53. La primera semana es la que contiene el primer jueves del año. (si el año comienza en viernes, esos 3 primeros días no son la primera semana del año)
WeekOfTheYear además te devuelve el año en el que se produce la primera semana.
Responder Con Cita
  #3  
Antiguo 03-12-2008
Avatar de paladincubano
paladincubano paladincubano is offline
Miembro
 
Registrado: jul 2007
Posts: 147
Poder: 17
paladincubano Va por buen camino
Muchas gracias por tu respuesta, pero no es lo que busco.
En realidad conozco bien lo que hace la funcion WeekOfTheMonth.
No se si me hago entender.
Tengo una tabla con clientes y un campo Fecha_nac.

Cuando hago el
Select DATEPART(week, fecha_nac) - DATEPART(week, DATEADD(month, DATEDIFF(month, 0, fecha_nac), 0))+1 as SemanaMes from Clientes

me devuelve esto por ejemplo
SemanaMes
-----------
1
1
4
3
2
5
1

y cuando a esas mismas fechas les paso la funcion en delphi, se asemejan mucho los numeros, ejemplo
WeekOfTheMonth(Fecha_nac)
1
1
3
3
2
5
2

Muchos coinciden, pero otros no, y como me hace falta para mi programa que sea lo mismo que le digo, porque en delphi tengo que obtener otras fechas que no estan en la base de datos. Pues eso tiene que darme los mismos valores.
Resumiendo, la consulta y la funcion no siempre devuelven los mismos valores, por eso es que quiero haceer mi propia funcion respecto a la funcion de la consulta.
pero como no se que devuelve el DatePart, el dateadd y el datediff, por eso no puedo hacerla. ya que la consulta no la hice yo, la encontre en la web.
Espero me haga entender.
saludos
Responder Con Cita
  #4  
Antiguo 03-12-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
WeekOfTheMonth no devuelve todo lo que hace el calculo que haces con el SQL.

Debes traducir el calculo SQL con otras funciones Delphi:
DATEPART() - WeekOfTheMonth o WeekOfYear
DATEADD() - TDateTime + numero de días
DETEDIFF() - Restar dos TDateTime

Código Delphi [-]
function MyWeekOfTheMonth(Date: TDate): Integer
begin
   AAA := DATEDIF(month, 0, fecha_nac);
{       - Que hace DATEDIF(month, 0, fecha_nac) - devuelve la cantidad de meses entre 0 y la fecha_nac?}
   BBB := DATEADD(month, AAA, 0);
{       - Qué hace DATEADD(month, diferencia, 0) - agrega 0 meses a fecha_nac?}
   result := WeekOf(Date) - WheekOf( BBB ) + 1;
end;

Última edición por duilioisola fecha: 03-12-2008 a las 17:45:25.
Responder Con Cita
  #5  
Antiguo 03-12-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Mirándolo nuevamente, creo que esta es la solución:
Código Delphi [-]
function MyWeekOfTheMonth(Date: TDate): Integer
var
   Meses : integer;
   FechaInicial : TDateTime;
   FechaAuxiliar : TDateTime;
begin
   FechaInicial := StrToDate('01/01/1900');        {es el 0 en DATEDIF y DATEADD - Supongo que será una fecha inicial}
   Meses := MonthsBetween(FechaInicial , Date);    {DATEDIF(month, 0, fecha_nac)}
   FechaAuxiliar := IncMonth(FechaInicial ,Meses); {DATEADD(month, diferencia, 0)}
   result := WeekOf(Date) - WheekOf(FechaAuxiliar) + 1;
end;
Responder Con Cita
  #6  
Antiguo 03-12-2008
Avatar de paladincubano
paladincubano paladincubano is offline
Miembro
 
Registrado: jul 2007
Posts: 147
Poder: 17
paladincubano Va por buen camino
Casi casi hombre.
Pero siguen datos que no son iguales.
El por que no lo se.
De echo, tengo dos listbox, en uno los de la consulta y en otro los de la funcion.
Se parecen mucho, pero varian algunos, incluso, extrañisimo, hay uno con valor -51
No se, falta algo en esa funcion que me has dado, quizas un simple detallito que estas obviando.
Porque te repito, los valores se asemejan muchisimos.
Los que mas varian son los que en uno me da la semana 5 en el otro me da la semana 1.
y viceversa. y luego esta ese otro que me da -51
Saludos,.

Última edición por paladincubano fecha: 03-12-2008 a las 18:42:21.
Responder Con Cita
  #7  
Antiguo 03-12-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Ahora te toca a ti:
- Averigua cual es la diferencia entre DATEDIF y MonthsBetween
- Averigua cual es la diferencia entra DATEADD e IncMonth
- Averigua cual es la diferencia entre DATEPART y WeekOf

Yo creo que la clave está en la forma en que calcula la semana según una fecha (DATEPART y WeekOf)

Para eso puedes hacer un select de las fechas de un año y compararlas
Código SQL [-]
SELECT FECHA, DATEPART(WEEK,FECHA) FROM ...
y luego comparar FieldDATEPART con WeekOf(FieldFECHA)
Responder Con Cita
  #8  
Antiguo 04-12-2008
Avatar de paladincubano
paladincubano paladincubano is offline
Miembro
 
Registrado: jul 2007
Posts: 147
Poder: 17
paladincubano Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
Ahora te toca a ti:
- Averigua cual es la diferencia entre DATEDIF y MonthsBetween
- Averigua cual es la diferencia entra DATEADD e IncMonth
- Averigua cual es la diferencia entre DATEPART y WeekOf

Yo creo que la clave está en la forma en que calcula la semana según una fecha (DATEPART y WeekOf)

Para eso puedes hacer un select de las fechas de un año y compararlas
Código SQL [-]SELECT FECHA, DATEPART(WEEK,FECHA) FROM ...

y luego comparar FieldDATEPART con WeekOf(FieldFECHA)
Tienes toda la razon. Lo primero que he echo es una comparacion con Datepar(ww,fecha) y un WeekOf(Fecha) y los resultados muchos difieren por un decima, muchos son iguales pero como te dije, otros difieren, supongo que sea que SQL calcula de una forma la semana del ano y delphi la calcula de otra forma. He estado mirando y segun Microsoft este usa el ISO 8601 para calcular la semana, y segun la ayuda del delphi, WeeoOf tambien la usa. A quien le creemos??
Seguire investigando a ver que puedo hacer.
gracias por tu valiosa ayuda.
Responder Con Cita
  #9  
Antiguo 04-12-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
DATEPART(WEEK,FECHA) y WeekOf(FECHA) deberían devolver los dos un entero.
A veces las conversiones de un SQL pueden darte 2,000000001.
Estos valores los deberías tomar como enteros.
Si DATEPART te devuelve 2,5 no tiene sentido para mi.

Además, debes comparar DATEADD con IncMonth y DATEDIF con MonthsBetween.

Ya nos dirás algo más...
Responder Con Cita
  #10  
Antiguo 04-12-2008
Avatar de paladincubano
paladincubano paladincubano is offline
Miembro
 
Registrado: jul 2007
Posts: 147
Poder: 17
paladincubano Va por buen camino
Que no hombre, se que devuelven enteros.
Toda la funcion se basa en Datepart y WeekOf. Si alguna de ellas devuelve un valor diferente a la otra pues toda lo demas en la funcion saldra mal.
Ya te digo, los valores casi son los mismos. ejm.

Datepart(ww,fecha), WeekOf(Fecha)
38, 38
12, 12
19, 19
34, 33
22, 22
41, 40
..
..
Ya te digo, es la minoria, pero si, hay valores que difieren, imagino que el problema esté en el calculo interno de cada funcion. Si se sigue el ISO correctamente no deberia haber problemas, ahora, si hay valores que difieren, pues alguien cometio un error en alguna de las funciones, entiendes? No voy a averiguar quien fue, si Microsoft o Codegear. Pero si se sigue un ISO a la hora de hacer una funcion, pues no TENDRIA que haber problemas. No creo que sea un problema de redondeo, porque como bien dices, ambas funciones devuelven enteros.
He probado con todas las variantes en la clausula SQL con SET DATEFIRST X (decirle que dia comiensa la semana) e igual, el problema persiste.
Ya vere que puedo hacer.
saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como se si el Update se llevo a cabo cacuna Oracle 8 14-06-2006 17:57:13
Necesito saber como hacer esto en delphi arpegius25 Varios 7 07-05-2006 12:03:49
Como hago esto en Delphi ? Markos1970 OOP 5 19-12-2005 16:40:29
¿eres nuevo en delphi como yo? ,, esto te ayudara perudelphi Noticias 1 09-12-2004 08:41:03
Como llevo de un txt a una tabla de forma atomatica? danytorres Varios 2 27-09-2003 20:28:42


La franja horaria es GMT +2. Ahora son las 20:27:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi