несоответствие типа данных математическим операторам для целого числа, сгенерированного пользовательской функцией

#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 это не a date .

Ответ №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;