Cuándo usar cutoff_date
Usá cutoff_date cuando el análisis es "todo desde el comienzo del mes hasta un día elegido" — revenue month-to-date, reportes de cierre mensual, snapshots "as-of". El usuario elige una sola fecha; Looky manda automáticamente tanto date_from (el primer día de ese mes) como date_to (la fecha elegida) como parámetros.
Usá date_range cuando el usuario necesita elegir los dos extremos libremente. Usá date_range_preset cuando la elección es entre presets con nombre como "last 30 days" o "this quarter".
Campos requeridos
type: cutoff_date
Campos opcionales
label— display label arriba del picker.default— token de fecha (mirá abajo) o string ISO de fecha. Default a"".granularity— controla cómo se derivadate_fromdesde la fecha elegida. Uno deday,month(default),quarter,year. Conday,date_fromiguala a la fecha elegida (ventana de un día). Conmonth, el primer día del mes de la fecha elegida. Conquarter, el primer día del calendar quarter de la fecha elegida (Ene, Abr, Jul u Oct). Conyear, 1 de enero del año de la fecha elegida. Honrado tanto a nivel dashboard como visualization.include_current_day— boolean. Defaultfalse. Mirá Máximo seleccionable.
Máximo seleccionable — hoy o ayer
Por default, el filtro cutoff_date capa la fecha máxima en hoy − 1 día. El picker no permite seleccionar hoy, el token resuelve a hoy pero se baja a ayer, y los date_to enviados a la query siempre terminan en ayer. Esa es la convención histórica de reportes "as-of cierre del día anterior": los datos del día en curso suelen estar incompletos hasta el cierre del día, así que el reporte se ancla al último día cerrado.
Para casos operativos en vivo — donde sí querés ver datos del día en curso — agregá include_current_day: true:
filters:
- type: cutoff_date
label: Fecha de corte
default: ""
include_current_day: true
Con el flag prendido:
- El picker permite seleccionar hoy como fecha máxima.
resuelve a hoy y no se clampa.- Los
date_toenviados a la query son inclusivos del día en curso.
El flag es opt-in (default false) para preservar back-compat con dashboards de reporte diario (PDFs, cierres de período) cuya semántica espera "hasta ayer cerrado".
Cuándo prenderlo: dashboards operativos en vivo, KPIs de "lo que llevo hasta este instante", facturación en curso, monitoreo de avance. Cuándo dejarlo apagado (default): reportes que se exportan a PDF y se envían como cierre de día, snapshots históricos, reportes que requieren consolidación post-cierre.
El flag se declara independientemente en cada filter — en la visualization (si se abre suelta) y en el dashboard (si tiene un filter global que propaga vía param:). Si la viz vive dentro de un dashboard con filter global, el flag del dashboard es suficiente; el valor resuelto llega a la viz vía param.
Tokens de fecha para defaults
Estos tokens resuelven contra la timezone actual del usuario en page load:
//
Cualquier cosa que no esté en esta lista se trata como un string ISO de fecha literal (ej. "2024-12-31").
Cómo llega el valor a la query Malloy
La fecha elegida setea dos parámetros en cada query a la que aplica el filtro:
date_from— derivado de la fecha elegida segúngranularity(default al primer día de su mes).date_to— la fecha elegida misma.
Tu model de Malloy declara esos dos parámetros y los usa en cláusulas where::
##! experimental.parameters
source: orders(
p_date_from::date is @2024-01-01,
p_date_to::date is @2024-12-31
) is bigquery.table('...') extend {
view: revenue_mtd is {
where:
created_at::date >= p_date_from
and created_at::date <= p_date_to
aggregate:
revenue is sum(sale_price)
}
}
Diferencias entre adapters
Tanto date_from como date_to son parámetros de date / timestamp. En BigQuery bindean nativo. En Postgres y MySQL el model tiene que usar el patrón de placeholder @param en el SQL subyacente — mirá la comparación de adapters de source y Soporte de Malloy.
Ejemplos trabajados
Cutoff default es hoy:
filters:
- type: cutoff_date
label: Cutoff
default: ""
Cutoff default es fin del mes pasado (para reportes de cierre mensual):
filters:
- type: cutoff_date
label: Closing date
default: ""
Cutoff default es una fecha literal (para un snapshot histórico fijo):
filters:
- type: cutoff_date
label: As of
default: "2024-12-31"
Errores comunes
- La query necesita otro shape de rango.
cutoff_datees opinionado:date_fromhace snap al comienzo de la ventana degranularityde la fecha elegida (day, month, quarter, year). Si necesitás que el usuario elija el lower bound libremente, usá date_range. - El model Malloy espera nombres de parámetro distintos.
cutoff_datesiempre emitedate_from/date_to. Adaptá los nombres de parámetro del model en consecuencia, o usá date_range_preset que soporta bindings custom. - La query falla en Postgres o MySQL con un error de date-binding. Agregá el patrón de placeholder
@paramen el SQL del model — mirá la comparación de adapters de source. - El token default no se reconoce. Solo los tokens listados arriba son válidos. Cualquier otra cosa se trata como un string de fecha literal y silenciosamente no hace nada útil si está malformado.
- Múltiples filtros cutoff_date en una viz. Solo un cutoff aplica. Usá otro tipo de filtro (o dos pares de parámetros separados) si necesitás múltiples ventanas temporales.
- "El reporte muestra hasta ayer aunque puse
". Es el comportamiento por default — el cutoff se clampa ahoy − 1. Si querés incluir el día en curso, agregáinclude_current_day: trueal filter. Mirá Máximo seleccionable. - El flag
include_current_dayestá en la viz pero el dashboard sigue mostrando ayer. Cuando la viz vive dentro de un dashboard con filter global (param: cutoff_date), es el flag del filter del dashboard el que manda — el dashboard resuelve el valor y lo propaga a la viz vía param. Prendé el flag en el filter del dashboard, no solo en la viz.