#sql #vba #ms-access-2010
#sql #vba #ms-access-2010
Вопрос:
Я пытаюсь запустить действительно простой запрос select в MS Access, который вызывает пользовательскую функцию, созданную кем-то другим. Функция возвращает целое число, но когда я пытаюсь применить критерии с помощью простых операторов, мне говорят, что есть несоответствие типа данных. Это расстраивает, так как непосредственно перед тем, как я получу это сообщение, и все значения будут заменены на ‘#NAME?’, Я вижу, что была возвращена правильная информация. Может кто-нибудь указать, где я ошибаюсь?
Запрос:
SELECT p.nhs_number, age(p.date_of_birth) AS age
FROM patient_tbl AS p
WHERE (((age(p.date_of_birth))<16));
Функция:
' Returns the difference in full years from DateOfBirth to current date,
' optionally to another date.
' Returns zero if AnotherDate is earlier than DateOfBirth.
'
' Calculates correctly for:
' leap years
' dates of 29. February
' date/time values with embedded time values
' any date/time value of data type Date
'
' DateAdd() is used for check for month end of February as it correctly
' returns Feb. 28th when adding a count of years to dates of Feb. 29th
' when the resulting year is a common year.
'
' 2015-11-24. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function Age( _
ByVal DateOfBirth As Date, _
Optional ByVal AnotherDate As Variant) _
As Integer
Dim ThisDate As Date
Dim Years As Integer
If IsDate(AnotherDate) Then
ThisDate = CDate(AnotherDate)
Else
ThisDate = Date
End If
' Find difference in calendar years.
Years = DateDiff("yyyy", DateOfBirth, ThisDate)
If Years > 0 Then
' Decrease by 1 if current date is earlier than birthday of current year
' using DateDiff to ignore a time portion of DateOfBirth.
If DateDiff("d", ThisDate, DateAdd("yyyy", Years, DateOfBirth)) > 0 Then
Years = Years - 1
End If
ElseIf Years < 0 Then
Years = 0
End If
Age = Years
End Function
Спасибо!
Комментарии:
1. Я предполагаю, что
p.date_of_birth
это не adate
.
Ответ №1:
У вас могут быть некоторые значения Null.
Попробуйте исключить эти:
SELECT p.nhs_number, age(p.date_of_birth) AS age
FROM patient_tbl AS p
WHERE (p.date_of_birth Is Not Null) And (age(p.date_of_birth)<16);
или замените их:
SELECT p.nhs_number, age(Nz(p.date_of_birth, Date())) AS age
FROM patient_tbl AS p
WHERE age(Nz(p.date_of_birth, Date()))<16;