Filters and date ranges
The operators and named date periods behind every filter in sanda, how a condition is read, how date windows begin and end, and which time zone they use.
Wherever you narrow a question in sanda, you are writing a condition: a field, a comparison and one or more values. This page is the reference for how those conditions read, the operators available, the named date periods, and how a date window is worked out. It ends with the filters on a search index, which use a smaller vocabulary of their own.
Where filters appear
| Where | What it is |
|---|---|
| query semantic fluid, on the semantic fluid page | The only rows where strip under your selection, with add a condition |
| A report block | The conditions in the block's builder |
| A whole report | The filters button on the report canvas, which opens filters · every block |
| A push | Which rows in the push editor, which narrows the records a push sends values for. See create a push |
| cherry and connected assistants | The conditions of a query, with a named period in relative |
| A search index | Filters on the columns you kept beside the text. See search filters |
A condition narrows one question and is thrown away with it. A named filter on your semantic fluid is different: a condition your team wrote down and signed off, so that "approved" means one thing in every question. You use a named filter by name. A condition is something you are doing right now.
How a condition works
A condition has three parts.
- The field. A dimension by its name, or any column of a table on your semantic map. The picker searches both, so you do not have to turn a column into a dimension first.
- The operator. What to compare. The operators offered depend on the field's type.
- The values. How many depends on the operator.
sanda reads a field's type from the dimension's kind or the column's data type: text, number, true or false, or date and time. A date field is offered the date operators, so you are never asked to match a timestamp as if it were text.
Every condition on a question must hold at once. There is no "or" between conditions. To match either of two values, give one condition both values.
A condition takes up to 20 values, each up to 200 characters. A question takes up to 20 conditions, and a report holds up to 20 filters.
Operators
| Operator | Reads as | Field types | Values |
|---|---|---|---|
equals |
is | text, number, true or false, date and time | One or more |
not_equals |
is not | text, number, true or false, date and time | One or more |
contains |
contains | text | One or more |
not_contains |
does not contain | text | One or more |
starts_with |
starts with | text | One or more |
ends_with |
ends with | text | One or more |
gt |
is more than | number | One |
gte |
is at least | number | One |
lt |
is less than | number | One |
lte |
is at most | number | One |
between |
is between | number | Two (from and to) |
in_range |
is within | date and time | Two (from and to) |
before |
is before | date and time | One |
on_or_after |
is on or after | date and time | One |
set |
has a value | text, number, true or false, date and time | None |
not_set |
is empty | text, number, true or false, date and time | None |
A few behaviours worth knowing:
- is with one value matches it. With several values it means "is one of them". In the console, separate several with commas.
- is not and does not contain keep rows where the field is empty. A row whose status was never set is not a row whose status is "paid", so excluding "paid" does not silently drop the blanks.
- contains, starts with and ends with ignore capitals. With several values they match any one of them. A
%or_in your value is matched as itself. - is between includes both ends.
- is on a date matches one exact moment. To match a whole day, use is within with that day as both ends.
- has a value and is empty take no value.
Date ranges
Both ends, and which one is excluded
A date window is half-open: it includes its start and excludes its end. July is from 1 July up to, but not including, 1 August. That means the whole of 31 July is in and the first moment of 1 August is out, whether the column holds a date, a timestamp or a timestamp with a time zone.
The alternative, an inclusive pair of dates, is a common date bug in reporting. A window ending "31 July" against a timestamp means "up to midnight at the start of the 31st", and a day of trading disappears without a word. sanda avoids it by design.
You do not need to think about this when you pick dates yourself. The to date you enter is the last day that is in the window, and the label beside the boxes says "both days included". sanda stores the next midnight behind the scenes.
Named periods
Pick a period by name instead of typing dates. They appear as buttons under is within.
| Period | Reads as | Kind |
|---|---|---|
today |
today | A single day |
yesterday |
yesterday | A single day |
tomorrow |
tomorrow | A single day |
last_7_days |
last 7 days | Rolling, to the last full day or month |
last_30_days |
last 30 days | Rolling, to the last full day or month |
last_90_days |
last 90 days | Rolling, to the last full day or month |
last_3_months |
last 3 months | Rolling, to the last full day or month |
last_6_months |
last 6 months | Rolling, to the last full day or month |
last_12_months |
last 12 months | Rolling, to the last full day or month |
this_week |
this week | The current period |
this_month |
this month | The current period |
this_quarter |
this quarter | The current period |
this_year |
this year | The current period |
last_week |
last week | The last full period |
last_month |
last month | The last full period |
last_quarter |
last quarter | The last full period |
last_year |
last year | The last full period |
next_7_days |
next 7 days | Ahead of today |
next_30_days |
next 30 days | Ahead of today |
The Kind column groups the periods: a single day, rolling, the current period, the last full period, and ahead of today. The conventions below say exactly where each period starts and ends:
today,yesterdayandtomorroware single days.- The day-based rolling periods count whole days back from the start of today.
last_7_days,last_30_daysandlast_90_daysend yesterday.last_7_daysis the seven complete days ending yesterday. Today is a part-day, and including it would make a daily total look as if it fell off a cliff every morning. - The months periods are whole calendar months, ending with last month.
last_6_monthsasked in September is March to August: six months, each of them finished.last_90_daysis the rolling alternative when you want a quarter's trading counted back from yesterday. this_monthis the whole calendar month, not month to date. For history the two are the same. For anything dated forward, such as a due date, month to date would hide the rows you opened the question to find.- Weeks start on Monday.
- Quarters and years are calendar quarters and years, January to March and so on. There is no financial year period. For 1 July to 30 June, press pick the dates myself and enter them.
next_7_daysandnext_30_daysstart tomorrow.
Here is what each period means on Wednesday 30 September 2026:
| Period | Covers |
|---|---|
today |
30 September |
yesterday |
29 September |
tomorrow |
1 October |
last_7_days |
23 to 29 September |
last_30_days |
31 August to 29 September |
last_90_days |
2 July to 29 September |
this_week |
Monday 28 September to Sunday 4 October |
last_week |
21 to 27 September |
this_month |
1 to 30 September |
last_month |
1 to 31 August |
last_3_months |
1 June to 31 August |
last_6_months |
1 March to 31 August |
last_12_months |
1 September 2025 to 31 August 2026 |
this_quarter |
1 July to 30 September |
last_quarter |
1 April to 30 June |
this_year |
1 January to 31 December 2026 |
last_year |
1 January to 31 December 2025 |
next_7_days |
1 to 7 October |
next_30_days |
1 to 30 October |
The console prints the resolved days under the period buttons, so you can check a window before it goes into a board pack.
Time zones
Which time zone a named period uses depends on where you set it.
- In the console. When you press a period in the semantic fluid workbench or a block's conditions, sanda works out the dates at that moment, in your browser's time zone, at your local midnight. The dates it worked out are what is sent.
- In a report's filters. A period set in filters · every block is kept as a period, not as dates, so the window moves with the calendar. sanda works it out on its own servers, in UTC, each time a block runs.
- In a push. A period under Which rows is kept as a period too, so a push that sends "last 30 days" every day sends a window that moves with it. sanda works it out in UTC each time the push runs.
- Through cherry and connected assistants. There is no browser, so a named period is worked out in UTC, and the result carries the dates it used. Ask cherry which dates it used if you need to see them.
UTC midnight is 10am in Sydney during standard time and 11am during daylight saving. So a window worked out in UTC starts and ends at that hour, and before it each morning, UTC is still on yesterday's date. "Yesterday", asked at 8am in Sydney, is the day before the Sydney yesterday. When the exact days matter, such as a month-end close, give explicit dates.
In reports
A condition on the filters · every block pane applies to every block. It replaces a block's own condition on the same field, so "last 12 months" there widens a block that said "last month". You can also type a sentence into say it, such as "only paid invoices" or "last 12 months", and sanda turns it into one condition for you. That uses AI, so it counts towards your daily AI limit.
Search filters
A search index has filters of its own, on the columns you kept beside the text when you created it. They are a smaller vocabulary than conditions, and every filter must match.
| Column holds | Comparisons in the console | Name used by assistants |
|---|---|---|
| Text | is, is not, contains | eq, neq, contains |
| A number, or a date and time | is, is not, greater than, at least, less than, at most | eq, neq, gt, gte, lt, lte |
| True or false | is, is not | eq, neq |
- A search takes up to eight filters, each value up to 200 characters.
- On text, is matches the whole value exactly, capitals included, and contains ignores capitals. A text column cannot be compared with greater than or less than.
- Dates and times in the console are entered in your own time zone.
- Connected assistants can also use
in, a list of up to 50 values.
See search your records.
Something unclear or out of date? Tell us, and we will fix the page.