Sync Rules are deprecated. For the Sync Streams version of this page, see Sync Data by Time.
The Problem
PowerSync pre-computes and caches which rows belong to which bucket parameters to enable efficient streaming. This means parameter-based filtering is limited to equality checks (=, IN, IS NULL). Range operators like >, <, >=, or <= are not supported on parameters.
Additionally, time-based functions like now() are not allowed in parameter expressions because the result changes depending on when the query runs, making pre-computation impossible.
This guide covers a few practical workarounds.
Workarounds
1: Pre-Defined Time Ranges
Add a boolean column to your table that indicates whether a row falls within a specific time range. Keep this column updated in your source database using a scheduled job. For example, add anupdated_this_week column:
pg_cron):
2: Buckets Per Date
Instead of pre-defined ranges, create a bucket for each date and let the client specify which dates to sync. Usesubstring to extract the date portion from a timestamp and match it with =:
3: Multiple Granularities
Combine multiple granularities in a single bucket definition. This lets you use larger buckets (days) for older data and smaller buckets (hours, minutes) for recent data.When using multiple time granularities (e.g., monthly, daily, hourly), rows move between buckets as time passes. Since each granularity creates a different bucket ID, the client must re-download the row from the new bucket even if it already has the data. This re-download overhead can nullify the benefits of granular filtering. For this reason, in some cases it may be better to sync entire months, avoiding the re-sync overhead, even if you sync more data initially.
Conclusion
Time-based sync is a common need, but PowerSync doesn’t support range operators or time-based functions on parameters directly. To recap the workarounds:- Pre-defined time ranges: Simplest option. Use when you have a fixed set of time ranges and don’t mind schema changes.
- Buckets per date: More flexible. Use when you need arbitrary date ranges but can live with a single granularity.
- Multiple granularities: Most flexible. Use when you need precision for recent data without syncing hundreds of buckets. Be mindful of the re-sync overhead.