Let's say we have a single overall version number maintained by the server (in a table), and it increments each transaction that is committed to the database.
And the database is setup to also maintain a version number column in each table, so that each row has a version number. Whenever a row is modified or added, the single overall version number for that row must be updated to the next value for that single overall version number. (An updated row will have its version column updated all the way to the latest version value in question regardless of its prior value.)
Further, the server returns to the client the latest of that single overall version number on each query.
When syncing client's version information is used in query, and so to its queries where clauses, for each table, a conjunction is added that restricts results to rows whose change version is >= that version number.
This will make the database do the work of identifying things that have changed since the (some given) last version (number).
Your mileage will vary, as sometimes on joins you will want the version restriction and other times not (e.g. a query to categories of items, you may want items that changed, but always get all their categories regardless of changes in the categories).
The above provides an algorithm to determine exactly what has changed since last sync. Now as to the question of when to sync. As @CandidedOrange says, the right time to sync is when a change has occurred, as now we're pushing change rather than needlessly pulling/polling.
So, someone, somewhere (either the client or the server) needs to understand the last version that each client did actually see.
As @CandidedOrange is alluding to, the work can be factored into two components:
(1) the server notices change, and pushes notifications. If the server knows the latest version number for each client, it can push the specific changes to each client for clients that will see changes (computing them as per the above algorithm). But if the server doesn't the latest version seen by each client, then it just pings all the client to try an update.
(2) When clients are pinged, either they get the change set (if server maintains latest client version), and in the other approach the client turns around and pulls changes from the server with the client's latest version number, updating as needed.