|
|
Возраст на конкретную или текущую дату
Простенько и с учетом високосности, лучшим приближением будет делить на 365.25, а астрономы говорят, что точнее 365,2475.
Выражение в запросе:
Age: IIf([пцтДатаРождения]>0;(Date()-[пцтДатаРождения])\365,2475;-1)
Или:
=DateDiff("yyyy";BDate;DATE())+(Format(DATE();"mmdd")<Format(BDate;"mmdd"))
Или:
=DateDiff("yyyy";[Дата рождения];Date())+(Format([Дата рождения];"mmdd")>Format(Date();"mmdd"))
Или SQL:
SELECT Фамилия, ДатаРождения
FROM ФДР
WHERE (((DateDiff("yyyy",[ДатаРождения],DATE())+(Format([ДатаРождения],"mmdd")>Format(DATE();"mmdd")))=18))
Ввод даты как параметра запроса (в конструкторе)
Возраст: DateDiff("yyyy";[BORN];[Введите дату])+(Format([BORN];"mmdd")>Format([Введите дату];"mmdd"))
Ещё вариант:
Public Function AgeByDateOfBirth(vDateOfBirth As Variant, _
Optional vForDate = Null) As Long
Dim iVal As Integer
Dim sVal As String
On Error GoTo AgeByDateOfBirth_Err
If IsNull(vForDate) Then vForDate = Date
AgeByDateOfBirth = DateDiff("yyyy", vDateOfBirth, vForDate)
If DateSerial(Year(vForDate), Month(vDateOfBirth), Day(vDateOfBirth)) > vForDate Then
AgeByDateOfBirth = AgeByDateOfBirth - 1
End If
AgeByDateOfBirth = AgeByDateOfBirth & sVal
AgeByDateOfBirth_Bye:
Exit Function
AgeByDateOfBirth_Err:
AgeByDateOfBirth = -1
Err.Clear
Resume AgeByDateOfBirth_Bye
End Function
Строкой:
Public Function AgeStr(vDateOfBirth As Variant, Optional vForDate = Null) As String
Dim iVal As Integer, lAge As Long
Dim sVal As String
On Error GoTo AgeStr_Err
If IsNull(vForDate) Then vForDate = Date
lAge = DateDiff("yyyy", vDateOfBirth, vForDate)
If DateSerial(Year(vForDate), Month(vDateOfBirth), Day(vDateOfBirth)) > vForDate Then
lAge = lAge - 1
End If
If 4 < lAge < 21 Then
sVal = " лет"
Else
iVal = lAge Mod 10
Select Case iVal
Case 1: sVal = " год"
Case 2, 3, 4: sVal = " года"
Case 5, 6, 7, 8, 9, 0: sVal = " лет"
End Select
End If
AgeStr = lAge & sVal
AgeStr_Bye:
Exit Function
AgeStr_Err:
AgeStr = "Err" & Err.Number
Err.Clear
Resume AgeStr_Bye
End Function
|
|