Foros del Web » Programando para Internet » ASP Clásico »

function Dias no laborables

Estas en el tema de function Dias no laborables en el foro de ASP Clásico en Foros del Web. Hola a todos necesito saber como puedo hacer para obtener el numero de dias laborables que hay entre dos fechas, dias laborables son todos menos ...
  #1 (permalink)  
Antiguo 22/03/2005, 11:01
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima Peru
Mensajes: 70
Antigüedad: 13 años, 10 meses
Puntos: 0
Pregunta function Dias no laborables

Hola a todos necesito saber como puedo hacer para obtener el numero de dias laborables que hay entre dos fechas, dias laborables son todos menos sabados y domingos y (festivos que tengo en una tabla de BD)

Les agradecere la orientación o la referencia de algun link donde lo pueda encontrar.
__________________
Fernando Parodi
  #2 (permalink)  
Antiguo 22/03/2005, 11:33
Avatar de Mickel  
Fecha de Ingreso: mayo-2002
Ubicación: Lima, Peru
Mensajes: 4.619
Antigüedad: 15 años, 2 meses
Puntos: 7
Soy de la idea de que hagas un DateDiff y al resultado le restes la suma de sabados, domingos y feriados
__________________
No tengo firma ahora... :(
  #3 (permalink)  
Antiguo 22/03/2005, 12:05
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima Peru
Mensajes: 70
Antigüedad: 13 años, 10 meses
Puntos: 0
La Pregunta Es Como Saco Esa Suma ??????????????????
__________________
Fernando Parodi
  #4 (permalink)  
Antiguo 22/03/2005, 12:08
Avatar de Muzztein  
Fecha de Ingreso: agosto-2002
Ubicación: Hangar 18
Mensajes: 1.703
Antigüedad: 14 años, 11 meses
Puntos: 16
Función DateDiff
Devuelve el número de intervalos entre dos fechas.

DateDiff(
intervalo,
fecha1,
fecha2 [,primerdíadelasemana[,
primerasemanadelaño]]
)

La sintaxis de la función DateDiff se compone de:

Argumentos
intervalo

Necesario. Expresión de cadena que es el intervalo que desea utilizar para calcular las diferencias entre fecha1 y fecha2. Consulte la sección Valores para ver los valores.

fecha1, fecha2

Necesario. Expresiones de fecha. Dos fechas que desee utilizar en el cálculo.

primerdíadelasemana

Opcional. Constante que especifica el día de la semana. Si no se especifica, se asume el domingo. Consulte la sección Valores para ver los valores.

primerdíadelaño

Opcional. Constante que especifica la primera semana del año. Si no se especifica, la primera semana se asume que es la semana del 1 de enero. Consulte la sección Valores para ver los valores.

Valores
El argumento intervalo puede tener los siguientes valores:

Valor Descripción
yyyy Año
q Trimestre
m Mes
y Día del año
d Día
w Día de la semana
ww Semana del año
h Hora
n Minuto
s Segundo


El argumento primerdíadelasemana puede tener los siguientes valores:

Constante Valor Descripción
vbUseSystem 0 Usa valores de API de idioma nacional (NLS).
vbSunday 1 domingo (valor predeterminado)
vbMonday 2 lunes
vbTuesday 3 martes
vbWednesday 4 miércoles
vbThursday 5 jueves
vbFriday 6 viernes
vbSaturday 7 sábado


El argumento primerasemanadelaño puede tener los siguientes valores:

Constante Valor Descripción
vbUseSystem 0 Usa valores de API de idioma nacional (NLS).
vbFirstJan1 1 Comienza con la semana del 1 de enero (valor predeterminado).
vbFirstFourDays 2 Comienza con la semana que tiene al menos cuatro días en el nuevo año.
vbFirstFullWeek 3 Comienza con la primera semana completa del nuevo año.


Comentarios
Puede utilizar la función DateDiff para determinar cuántos intervalos de tiempo especificados existen entre dos fechas. por ejemplo, podría utilizar DateDiff para calcular el número de días entre dos fechas o el número de semanas entre hoy y el final del año.

Para calcular el número de días entre fecha1 y fecha2, puede utilizar Día del año ("y") o Día ("d"). Cuando el intervalo es Día de la semana ("w"), DateDiff devuelve el número de semanas entre las dos fechas. Si fecha1 es un lunes, DateDiff cuenta el número de lunes hasta fecha2. Cuenta fecha2 pero no fecha1. Si intervalo es Semana ("ww"), sin embargo, la función DateDiff devuelve el número de semanas del calendario entre dos fechas. Cuenta el número de domingos entre fecha1 y fecha2. DateDiff cuenta fecha2 si es un domingo; pero no cuenta fecha1, aunque sea un domingo.

Si fecha1 hace referencia a un punto en el tiempo posterior a fecha2, la función DateDiff devuelve un número negativo.

El argumento primerdíadelasemana afecta a los cálculos que utilizan los símbolos de intervalo "w" y "ww".

Si fecha1 o fecha2 es un literal de fecha, el año especificado se convierte en parte permanente de dicha fecha. Sin embargo, si fecha1 o fecha2 está entre comillas (" ") y se omite el año, el año actual se inserta en el código cada vez que se evalúa la expresión fecha1 o fecha2. Esto hace que sea posible escribir el código que se puede utilizar en años diferentes.

Cuando se compara el 31 de diciembre con el 1 de enero del año inmediatamente siguiente, DateDiff para Año ("yyyy") devuelve 1 incluso aunque sólo haya pasado un día.

El siguiente ejemplo utiliza la función DateDiff para mostrar el número de días entre una fecha dada y el día de hoy:

Function DiffADate(theDate)
DiffADate = "Días a partir de hoy: " & DateDiff("d", Ahora, theDate)
End Function
  #5 (permalink)  
Antiguo 22/03/2005, 12:37
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 16 años, 5 meses
Puntos: 535
Esacto, como dice Mickel, con un datediff y restándole los sábados (día #7) y los domingos (día #1).. los feriados es algo más complicados porque pueden ser trasladables y no caer siempre en el mismo día de semana. Por allí tenía un script que lo metí dentro de una function:

Código:
Function Laborales(FInicio, FFin)
	CantDias = DateDiff("D", FInicio, FFin)
	CuentaLaborales = 0
	For i = 0 To CantDias
		DiaSemana = Weekday(DateAdd("D", i, FInicio))
		If DiaSemana <> 1 AND DiaSemana <> 7 Then CuentaLaborales = CuentaLaborales + 1
	Next
	Laborales = CuentaLaborales
End Function

Response.Write Laborales("19/03/2005", "27/03/2005") - Rs("CuentaDeFeriados") 

Fijate que lo que devuelve son los días laborales entre la fecha de inicio y la de fin, pero no tiene en cuenta feriados... pero como a éstos los tenés dentro de una tabla, hacés una consulta con la cuenta de los días feriados entre las mismas fechas que le pasás a la function y ese resultado se lo restás al resultado de la function

Saludos

PD: Muzztein, realmente es preferente que coloques el enlace a la página donde se encuentra esa info
__________________
...___...
  #6 (permalink)  
Antiguo 22/03/2005, 15:13
Avatar de sjam7  
Fecha de Ingreso: diciembre-2001
Ubicación: Guadalajara, Mexico
Mensajes: 3.669
Antigüedad: 15 años, 7 meses
Puntos: 16
solo agregar que los feriados se comprueben si no son dia 1 o 7 para que solo se resten si no se han restado por ser sabado o domingo
  #7 (permalink)  
Antiguo 22/03/2005, 18:27
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 16 años, 5 meses
Puntos: 535
Cita:
Iniciado por sjam7
solo agregar que los feriados se comprueben si no son dia 1 o 7 para que solo se resten si no se han restado por ser sabado o domingo

muy buena acotación que antes no se me había ocurrido y que es muy comunmente posible (por ejemplo: el 2 de abril, día de los caídos en malvinas -festivo o, mejor dicho, conmemoratorio argentino-, cae sábado e igualmente en esas condiciones se hubiese restado cuando no debería hacerlo)
__________________
...___...
  #8 (permalink)  
Antiguo 28/03/2005, 10:28
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima Peru
Mensajes: 70
Antigüedad: 13 años, 10 meses
Puntos: 0
Solucion

Aqui les dejo como me quedo al final, funciona perfecto.
Gracias por su colaboración

Código:
<% 
  Function diaslaborables
  	totalferiados = 0
	While ((Repeat4__numRows <> 0) AND (NOT programadas_descuento.EOF))
		fecha=(programadas_descuento.Fields.Item("fecha_inicio").Value)
		dias=(programadas_descuento.Fields.Item("cantidad_dias").Value)
		'---------------------------------------------------------
		diainicio = Day(fecha)'left(fecha,2)
		mesinicio = Month(fecha)'mid(fecha,4,2)
		anioinicio = Year(fecha)'right(fecha,4)
		inicio = anioinicio&"/"&mesinicio&"/"&diainicio
		'---------------------------------------------------------		
		fin = Dateadd("d",(dias-1),fecha)
		diafin = day(fin)'left(fin,2)
		mesfin = Month(fin)
		aniofin = Year(fin)'right(fin,4)
		fin = aniofin&"/"&mesfin&"/"&diafin
		'---------------------------------------------------------				
		'conexion BD
		Dim Feriados
		Dim Feriados_numRows
		
		Set Feriados = Server.CreateObject("ADODB.Recordset")
		Feriados.ActiveConnection = MM_Con_Vacaciones_STRING
		Feriados.Source = "SELECT count(*) AS TOTAL FROM Tbl_Feriados WHERE Fecha BETWEEN '"+inicio+"' AND '"+fin+"' "
		Feriados.CursorType = 0
		Feriados.CursorLocation = 2
		Feriados.LockType = 1
		Feriados.Open()
		
		Feriados_numRows = 0
		totalferiados = (dias-(Feriados.Fields.Item("TOTAL").Value))+totalferiados
  		diaslaborables = totalferiados
  

  		Feriados.Close()
 		Set Feriados = Nothing
  
  
  	Repeat4__index=Repeat4__index+1
	Repeat4__numRows=Repeat4__numRows-1
	programadas_descuento.MoveNext()
	Wend
  End Function		  
%>
__________________
Fernando Parodi
  #9 (permalink)  
Antiguo 28/03/2005, 11:46
Avatar de Muzztein  
Fecha de Ingreso: agosto-2002
Ubicación: Hangar 18
Mensajes: 1.703
Antigüedad: 14 años, 11 meses
Puntos: 16
ESTUPENDO!!!

publicala en la biblioteca !!!
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:38.