PDA

Ver la Versión Completa : cuantos domingos tiene un periodo


poliburro
14-02-2005, 18:24:09
Pues tengo problemas para sacar el algoritmo que de un periodo dado me retorne el numero de domingos que hay en ese periodo.

Si alguien me pudiera hechar la mano gracias

delphi.com.ar
14-02-2005, 18:58:36
Podrías utilizar WeeksBetween o DaysBetween entre las dos fecha, y dependiendo la posición en la semana de las fechas será un domingo menos o no.

Saludos!

poliburro
14-02-2005, 19:16:32
Function GetSundays(IniDate: TDateTime; EndDate: TDateTime): Integer;
Var
Sundays: Integer;
Begin
Sundays := WeeksBetween(IniDate,EndDate);
If DayOfWeek(EndDate) = 1 Then Result := SunDays + 1
Else Result := SunDays;
End;

jafl1965
14-02-2005, 19:38:27
Y si tu período también empieza el domingo? Debes validar eso también, porque por ejemplo:
Entre el 6 y el 27 de febrero hay 4 domingos y con tu función devuelve 3. Debes incluir ambos extremos, a no ser, claro, que tus períodos no empiecen nunca un domingo...

poliburro
14-02-2005, 19:55:30
mil gracias por la observacion.

:p

poliburro
14-02-2005, 20:06:31
asi quedo finalmente

Function GetSundays(IniDate: TDateTime; EndDate: TDateTime): Integer;
Var
Sundays: Integer;
Begin
Sundays := WeeksBetween(IniDate,EndDate);
If DayOfWeek(IniDate) = 1 then Sundays := Sundays + 1;
If DayOfWeek(EndDate) = 1 Then Sundays := SunDays + 1;
Result := SunDays;
End;

thelibmx
19-06-2007, 01:15:20
hola, me pregunto si podria ocupar esta misma funcion pero tambien para que me cuente los sabados, como podria hacerlo? es decir que el resultado final sea la suma de los sabados y los domingos del rango de las fechas puestas, podria modificar esa funcion y contar los sabados y domingos al mismo tiempo? ¿? o tendria que contar primero los domingos y luego los sabados en esa fecha,si alguien me pudiera auxiliar se los agradeceria muchisimo, si no pues de todos modos se los agradezco ja ja ja :)

Lepe
19-06-2007, 10:29:47
....Esto.... si tiene 3 domingos, fijo que también tiene 3 sábados :p
Aunque existe el caso especial: habiendo 1 domingo, tiene 2 sábados ;)

No es nada difícil hacer esa rutina, mira un calendario, enseguida lo verás.

Saludos

thelibmx
22-06-2007, 00:50:50
mmm, estaba viendo esa funcion y parece ser que en periodos mayores a una semana funciona bien, pero no funciona cuando es menos de una semana, por ejemplo si ponemos 08/06/2007 y 11/06/2007 el resultado que arroja es 0, y moviendo las fechas siempre y cuando sea menos de 7 dias el resultado sigue siendo 0 sabiendo que hay un domingo de por medio q no cuenta.

Supongo que esto es por que la funcion cuenta las semanas que hay en ese rango y no los dias en especifico, alguna sugerencia para podertomar en cuenta ese detalle...

¿ Existira alguna funcion que te devuelva cuantos dias domingos o lunes o martes etc... existen en un periodo de fechas ? ¿?

Seria bueno que existiera algo como WeeksBetween() pero de dias no?.. creo que seria asi SundaysBetween() jeje je.. pero creo que no existe jaja, si alguien conoce algo parecido seria muy bueno :) buen dia!!

egostar
22-06-2007, 02:03:36
Me tome la libertad de modificar la rutina de poliburro con sabados y domingos, además te recomiendo que leas la ayuda de Delphi sobre el manejo de fechas.

function TForm1.GetSundays(IniDate: TDateTime; EndDate: TDateTime): Integer;
var
Sundays: Integer;
i,Dias : Integer;
begin
Sundays := 0;
Dias := DaysBetween(IniDate,EndDate);
for I := 0 to dias - 1 do begin
If DayOfWeek(IniDate+i) = 1 then Sundays := Sundays + 1;
If DayOfWeek(IniDate+i) = 7 then Sundays := Sundays + 1;
end;
Result := SunDays;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ShowMessage(inttostr(GetSundays(strtodate('01/05/2007'),strtodate('30/06/2007'))));
end;

Salud OS.

thelibmx
22-06-2007, 02:35:01
muy buena tu funcion, yo tambien modifique un poco el codigo y lo adapte a lo que yo queria, que es contar los sabados y domingos de un periodo de fechas, les dejo el codigo para que lo chequen y me den sus sugerencias para mejorarlo o acortarlo je je

function cuentasabadosydomingos(fechaInicial:Tdatetime;fechafinal:Tdatetime):Integer;
var
Dias:Integer;
e,c:integer;
totaldominsaba:integer;
begin
Dias := Trunc (fechafinal) - Trunc (fechainicial);
dias:=dias+1;
totaldominsaba:=0;
c:=(Dias-1);
for e:=0 to c do
begin
if (DayOfTheWeek(fechaInicial)=6) or(DayOfTheWeek(fechaInicial)=7) then
begin totaldominsaba:=totaldominsaba+1;
end; fechaInicial:=IncDay(fechaInicial,1);
end;cuentasabadosydomingos:=totaldominsaba;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
e3.Text:=inttostr(cuentasabadosydomingos(DateTimePicker1.date,DateTimePicker2.date));
end;

egostar
22-06-2007, 02:45:12
Hola thelibmx, en esa rutina estas contando viernes y sabados.

Los dias se cuentan de 1 a 7 comenzando en Domingo.

Salud OS.

thelibmx
22-06-2007, 03:12:20
Hola thelibmx, en esa rutina estas contando viernes y sabados.

Los dias se cuentan de 1 a 7 comenzando en Domingo.

Salud OS.

creo que no entendi el comentario o el error, segun las pruebas que hice, sabado vale 6 y domingo 7, entonces cada que hay un sabado o domingo suma 1, podrias explicarte un poco, o tal ves tuviste tu algun error, por que incluso cuando selecciono alguna fecha en viernes, mi resultado es 0, ¿?..

egostar
22-06-2007, 03:18:29
Cierto, es que estas usando la función DayoftheWeek, la cual efectivamente, toma los valores de 1 a 7 comenzando en Lunes. Yo estoy usando DayofWeek, por eso la confusión.

Aqui te pongo la ayuda de Delphi


DayOfWeek returns the day of the week of the specified date as an integer between 1 and 7, where Sunday is the first day of the week and Saturday is the seventh.

Note:
DayOfWeek is not compliant with the ISO 8601 standard, which defines Monday as the first day of the week. For an ISO 8601 compliant version, use the DayOfTheWeek function instead.



Salud OS.

thelibmx
22-06-2007, 06:01:30
Cierto, es que estas usando la función DayoftheWeek, la cual efectivamente, toma los valores de 1 a 7 comenzando en Lunes. Yo estoy usando DayofWeek, por eso la confusión.

Aqui te pongo la ayuda de Delphi




Salud OS.


entonces ya no entendi, mi funcion esta bien no?, o cual es el punto, hasta donde vi hace lo q queria... je je je.. pero es bueno conocer otras funciones .. bueno saludos a todos

Lepe
22-06-2007, 11:30:59
Tu rutina está bien, lo que ocurre, es que DayofWeek considera el 1 como Lunes, DayofTHEWeek considera el 1 como Domingo.

Para evitar líos hay un estandar ISO, y se debería usar dayofTHEweek.

Ya que vamos a realizar un bucle por todos los días, haremos una rutina general (me gustaba más la rutina de poliburro ;)):



type TDay = (Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
Sunday = 7);

TDays = set of TDay;



function CountDays(ini:TdateTime; Fin:Tdatetime;const DaysToCount: TDays):integer;
var i:integer;
begin
Result := 0;
for I := trunc(ini) to trunc(fin) do
if Tday(Dayoftheweek(i)) in DaysToCount then
inc(Result);
end;



uso de la rutina:

begin
ShowMessage(inttostr(CountDays(DateTimePicker1.DateTime,
DateTimePicker2.DateTime,
[Saturday,Sunday])));
end;


Edito: Cambio los tipos enumerados por interferencia con las constantes de Sysutils dayMonday, dayTuesday etc.

thelibmx
22-06-2007, 16:59:02
ok me parece bien la rutina, pues hay muchas maneras jeje, hay que utilizar la mas estandar...SAludos.