Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Eso sí, cada SGBD ha tenido libertad para fijar su propio origen,
y así como nuestro calendario occidental contemporáneo difiere
en el origen del chino, del musulmán, judío, romano antiguo, el
de Access también puede diferir de los otros sistemas, y
teniendo en cuenta los ajustes provocados voluntariamente a
cada calendario (¿Sabes, p. ej., que Stª Teresa murió un 4 de
octubre y fue enterrada al día siguiente, 15 de octubre?. Pues,
sí, le pilló una reforma de calendario.)
Consecuencias:
Averiguar cuántos días han transcurrido entre dos fechas es,
nada más fácil, restarlas:
Clng(date()-MiFcNacimiento) -y a mí me sale la barbaridad
de 20939
(Ejercicio: ¿cuándo nació esta criatura?)
Ejercicios:
¿En que fecha comienza el calendario de Access?. ¿Cuál
es día 1?
¿Tiene sentido una fecha negativa?
¿Cuál es la diferencia entre "25/12/2003", 25/12/2003
y #25/12/2003#
Ejercicios:
Si Jaimito entra al despacho de la directora a las once
menos cuarto y sale veinte minutos más tarde, ¿a qué
hora ha salido?
Otro problema:
El padre de Jaimito trabaja en turno de noche en la fábrica
de colchones ColcheX y entró a las 10 y media de la noche del
14/7/2003. El turno es de 7 horas y 33 minutos. ¿A qué hora
salió?
Hago lo mismo:
ó que
ó que
ó que
Otro problema:
El padre de Jaimito trabaja en turno de noche en la
fábrica de fibra de vidrio "La Coronita" y entra todas las
noches a las 10 y media. El turno es de 7 horas y 33
minutos. ¿A qué hora sale?
Pues nada; que al no poner día nos considera las diez y media
de la noche del día cero.
Recordemos que dicho día (el cero):
¿Como?.
Y otro:
¿Cual es el día que está entre el 30 de diciembre de 2003
y el 1 de Enero de 2004?
Pues la semisuma:
?format((#30/12/2003# + #1/1/2004#)/2, "d-m-yyyy") = 31-
12-2003
Más claro:
?format((#30/12/2003# + #31/12/2003#)/2, "d-m-yyyy
h:n") = 30-12-2003 12:0, ó
?format((#30/12/2003# + #31/12/2003#)/2, "d-m-yyyy
h:nn") = 30-12-2003 12:00, ó
?format((#30/12/2003# + #31/12/2003#)/2, "d-m-yyyy
h:nn:ss") = 30-12-2003 12:00:00,
Otro:
Quisiera sumar un minuto a la hora actual.
Respuesta:
Now() + (1/1440).
Ó Now() + (1 / 60 / 24)
Más:
Dada una hora en un campo tipo date, llamado LaHora, ¿cómo
redondear al cuarto de hora siguiente?
Respuesta:
cdate(clng ((LaHora * 24 + 0.2499) * 4) / 4 / 24)
Y otro:
Dada una hora en LaHora, un campo tipo date, ¿cómo
redondear al cuarto de hora más cercano?
Respuesta:
Casos habituales.
Tienes separados o puedes separarlos los componentes del
tiempo: horas, minutos y, quizá, segundos
Su fracción es:
ó su equivalente
día , fracción_del_día
Anexos:
De Leonardo Henrnández Ferreiro
De Francisco Rivera:
' Salida:
' Valor de Retorno : La fecha de los días trabajados
tomando en cuenta fines de semana y vacaciones
' Ejemplo:
' AñadeDiasLab(10, #2/9/2000#, Array(#2/16/2000#,
#2/17/2000#))
' nos regresa #2/25/2000#, el cual es la fecha más 10 días
laborables
dtmTemp = FechaIn
For lngConteo = 1 To lngDias
dtmTemp = SigDiaLab(dtmTemp, ArrVacaciones)
Next lngConteo
AñadeDiasLab = dtmTemp
End Function
‘----------------------------------------------------------------------
--------------------------------------
Public Function SigDiaLab(Optional FechaIn As Date =
0,Optional ArrVacaciones As Variant = Empty) As Date
' Entrada:
' FechaIn: Fecha en la cual comenzamos a buscar. Se usa
la fecha actual no se especifica una.
' ArrVacaciones (Opcional): Array que contiene las fechas
de vacaciones. Puedes ser un solo valor
' Salida:
' Valor de Retorno: La fecha del siguiente día laborable
tomando en cuenta fines de semana y vacaciones
' Ejemplo:
' FechaIn = SigDiaLab(#5/23/1997#, #5/26/97#)
‘----------------------------------------------------------------------
--------------------------------------
Public Function AntDiaLab(Optional FechaIn As Date =
0,Optional ArrVacaciones As Variant = Empty) As Date
' Entrada:
' FechaIn: Fecha en la cual comenzamos a buscar. Se usa
la fecha actual no se especifica una.
' ArrVacaciones (Optional): Array que contiene las fechas
de vacaciones. Puedes ser un solo valor
' Salida:
‘ Valor de Retorno: La fecha del anterior día laborable
tomando en cuenta vacaciones y fines de semana
' Ejemplo:
' FechaIn = AntDiaLab(#1/1/2000#, Array(#12/31/1999#,
#1/1/2000#))
‘----------------------------------------------------------------------
--------------------------------------
Public Function PrimerDiaLabMes(Optional FechaIn As Date =
0, Optional ArrVacaciones As Variant = Empty) As Date
' Entrada:
' FechaIn: Fecha del mes que nos interesa. Usa la actual si
no especificamos una
' ArrVacaciones (Opcional): Array que contiene las fechas
de vacaciones. Puedes ser un solo valor
' Salida:
‘ Valor de Retorno: La fecha del primer día laborable en el
mes, tomando en cuenta vacaciones y fines de semana
' Ejamplo:
' FechaIn = PrimerDiaLabMes(#1/1/1999#, #1/1/1999#)
‘----------------------------------------------------------------------
--------------------------------------
Public Function UltimoDiaLabMes( Optional FechaIn As Date =
0, Optional ArrVacaciones As Variant = Empty) As Date
' Entrada:
' FechaIn: Fecha del mes que nos interesa
' ArrVacaciones (Opcional): Array que contiene las fechas
de vacaciones. Puedes ser un solo valor
' Salida:
‘ Valor de Retorno: La fecha del ultimo día laborable en el
mes, tomando en cuenta vacaciones y fines de semana
' Ejamplo:
' FechaIn = UltimoDiaLabMes(#12/1/1999#,
#12/31/1999#)
‘----------------------------------------------------------------------
--------------------------------------
Public Function ContarDiasLab(ByVal dtmInicio As Date, ByVal
dtmFin As Date, Optional ArrVacaciones As Variant = Empty) As
Integer
' Cuenta los días laborables (sin fines de semana ni
vacaciones en una rango de fechas )
' Requiere:
‘ SaltarVacaciones
' CountHolidays
' EsFindeSemana
' Entrada:
' dtmInicio: Fecha que especifica el inicio del rango
' dtmFin: Fecha que especifica el fin del rango
' ArrVacaciones (Opcional): Array que contiene las fechas
de vacaciones. Puedes ser un solo valor
' Salida:
‘ Valor de Retorno: Número de días laborables, sin contar
fines de semana y opcionalmente vacaciones
' Ejamplo:
' ContarDiasLab(#7/2/2000#, #7/5/2000#, )
intExtrae = intExtrae + _
ContarVacacionesA(ArrVacaciones, dtmInicio, dtmFin)
‘----------------------------------------------------------------------
--------------------------------------
Private Function ContarVacacionesA(ArrVacaciones As
Variant,dtmInicio As Date, dtmFin As Date) As Long
' Contamos las vacaciones entre dos fechas finales.
' Requerida por:
' ContarDiasLaborables
' Requiere:
' EsFindeSemana
ManejoError:
Resume ExitHere
End Function
Private Function FindItemInArray(varItemToFind As Variant, _
avarItemsToSearch As Variant) As Boolean
Dim lngItem As Long
ExitHere:
Exit Function
ManejoError:
Resume ExitHere
End Function
‘----------------------------------------------------------------------
--------------------------------------
Private Function EsFindeSemana(dtmTemp As Variant) As
Boolean
' Si tus fines de semana no son Sábado (día7) ó Domingo
(Día 1) cambiamos la rutina para devolver
' True para cualquier días que uses como tus fines de
semana
' Requerida por:
‘ SaltarVacaciones
' PrimerDiaLabMes
' UltimoDiaLabMes
' SigDiaLab
' AntDiaLab
' ContarDiasLab
‘----------------------------------------------------------------------
--------------------------------------
Private Function SaltarVacaciones( ArrVacaciones As Variant,
dtmTemp As Date, intIncrement As Integer) As Date
' Nos saltamos los fines de semana y vacaciones en un
arreglo referido como by ArrVacaciones.
' Requiere:
' EsFindeSemana
Do
Do While EsFindeSemana(dtmTemp)
dtmTemp = dtmTemp + intIncrement
Loop
Select Case VarType(ArrVacaciones)
Case vbArray + vbDate, vbArray + vbVariant
Do
blnEncontrado = FindItemInArray(dtmTemp,
ArrVacaciones)
If blnEncontrado Then
dtmTemp = dtmTemp + intIncrement
End If
Loop Until Not blnEncontrado
Case vbDate
If dtmTemp = ArrVacaciones Then
dtmTemp = dtmTemp + intIncrement
End If
End Select
Loop Until Not EsFindeSemana(dtmTemp)
ExitHere:
SaltarVacaciones = dtmTemp
Exit Function
ManejoError:
Resume ExitHere
End Function
Esto sería:
lsdt=#16:00#-#15:45#
?lsdt
1.04166666666666E-02
? (24*60)*1.04166666666666E-02
14.9999999999999 (aproximadamente 15 minutos para
n/1000ths de un segundo)
?1.04166666666666E-02 +1.04166666666666E-02
2.08333333333332E-02
?(24*60)*2.08333333333332E-02
29.9999999999998 (Lo suficientemente cerca a 30 minutos)
?format(2.08333333333332E-02,"short time")
00:30
Lo cual es muy útil.
Por ejemplo si tus cobros son 11.50 por hora entonces tu
promedio diario es = 24*11.50 y el cargo para 30 minutos de
trabajo sería:
?24*11.50 * 2.08333333333332E-02
5.74999999999996
?47*2.08333333333332E-02
0.97916666666666
?24* 0.97916666666666
23.4999999999998 (47 medias horas son 23.5 horas)
?48*2.08333333333332E-02
0.999999999999994
?24*0.999999999999994
23.9999999999999 (24 horas)
?49*2.08333333333332E-02
1.02083333333333
?24*1.02083333333333
24.4999999999999 (24.5 Horas)
lsdt=#01-dic-99#
?lsdt
01/12/99
lsdt=lsdt+1.02083333333333
?lsdt
02/12/99 00:30:00
?format(1.02083333333333,"short Time")
00:30
lsdt=1.020833333333
dias=Int(lsdt)
?dias
1
Horas=24*(lsdt-dias)
?horas
0.499999999991999
minutos=(horas-int(horas))*60
?minutos
29.99999999952
minutos =mins/(24*60)
Horas=hrs/24
Tiempo=horas + minutos
?#07:30#-#00:00#
0.3125
minutos=30/(24*60)
horas=7/24
?horas+minutos
0.3125
Yo suelo tener definidas unas constates públicas que me lo
tienen preparado.
Por una observación inicial hecha por Lyle Fairfield, aqui hay
una solución para obtener el número de, digamos, miércoles
entre dos fechas indicadas:
pero
If IsNull(LaFecha) Then
UltimoMes = Null
Else
D = Day(LaFecha)
M = Month(LaFecha)
Y = Year(LaFecha)
' Encontramos el primer día del siguiente mes y
regresamos un día
UltimoMes = DateAdd("m", 1, DateSerial(Y, M, 1)) - 1
End If
End Function
37393,6459953704
FIN