You can use DATEDIFF function to check the days between both date

set date1 = $zdate($horolog,3)
set date2 = $zdate($zdateh("2020-09-01",3),3)
write $SYSTEM.SQL.DATEDIFF("dd",date2,date1)     // 1

In your scenario it could be like this:

$SYSTEM.SQL.DATEDIFF("dd",$ZDATE($ZDATEH(HL7.{PID.7},3),3),$ZDATE($HOROLOG,3)) <= 3

This is a boolean condition, so your rule only have that condition

UPDATE

Rules only accept functions from functions class, so you should create a new class with that function:

Class MyFunctions Extends Ens.Rule.FunctionSet
{
ClassMethod DaysDobHL7(pDob As %String) As %Integer
{
    set date1 = $zdate($horolog,3)
    set date2 = $zdate($zdateh(pDob,3),3)
    
    quit $SYSTEM.SQL.DATEDIFF("dd",date2,date1)
}

then, your new function should be visible in rules function

Regards,
Francisco Lopez

Finally, I've added the following method in request class

 
Method Find(item As LabCenter)
{
    for i=1:1:..ListCenter.Count(){
        set tmp=..ListCenter.GetAt(i)
        if tmp.LabId=item.LabIdtmp.Center=item.Centertmp.Code=item.Code return i
    }
 
    quit 0
}

By this way, I find my Lab-Center

> set obj=##class(ListLabCenter).%OpenId(1)
> zw obj
obj=<OBJECT REFERENCE>[2@ListLabCenter]
+----------------- general information ---------------
|      oref value: 2
|      class name: ListLabCenter
|           %%OID: $lb("1","ListLabCenter")
| reference count: 2
+----------------- attribute values ------------------
|       %Concurrency = 1  <Set>
+----------------- swizzled references ---------------
|      i%ListCenter = ""
|   i%ListCenter(1) = $lb($lb("A08829848","A088298480001",""))
|   i%ListCenter(2) = $lb($lb("A08829848","A088298480002",""))
|   i%ListCenter(3) = $lb($lb("A08829848","A088298480003",""))
|   i%ListCenter(4) = $lb($lb("U66700196","U667001960002",""))
|   i%ListCenter(5) = $lb($lb("U66700196","U667001960003",""))
|   r%ListCenter = "1@%Collection.ListOfObj"
|   r%ListCenter(1) = "3@LabCenter"
+-----------------------------------------------------
> set objFind = ##class(LabCenter).%New()
> set objFind.LabId="A08829848"
> set objFind.Center="A088298480003"
> zw objFind
objFind=<OBJECT REFERENCE>[5@LabCenter]
+----------------- general information ---------------
|      oref value: 5
|      class name: LabCenter
| reference count: 2
+----------------- attribute values ------------------
|             Center = "A088298480003"
|               Code = ""
|              LabId = "A08829848"
+-----------------------------------------------------
> w obj.Find(objFind)
3
> set objFindFake = ##class(LabCenter).%New()
> set objFindFake.LabId="FAKE"
> set objFindFake.Center="A088298480003"
> w obj.Find(objFindFake)
0

Thanks for your help.

Best regards,
Francisco López

We are preparing a great concert to celebrate it with world famous guests, such as Beyonce, Jenifer Lopez, Maluma, Elton John, Paul McCartney, Rosalia, and some other surprises ...
We are waiting for the pandemic to allow us to do so, or we are going to have to suspend it.

hehehe, just kidding ... we will have a couple of beers for what we have done and for what we are going to do.

Thanks @Anastasia Dyubaylo 
 

That depends on your data model.

If you require many related tables, it may be more useful to have the invocation with the data you need by appending the tables by primary keys.


SELECT table1.code, table2.description
FROM table1
INNER JOIN table2 ON table2.tab_id = table1.id

Also, it's important create the proper index to the fields that you need to search.

There is not a simple answer :)

Best Regards,
Francisco Lopez