#3777 / PR #4041 把「裸 YYYY-MM-DD 上界 = 含当天整天」的操作符敏感翻译落在了 SQL 驱动的比较发射点(SqlDriver.calendarDayUpperBoundRewrite,SqliteWasmDriver 继承)与 analytics 策略层。非 SQL 驱动未对齐,同一 dashboard 换驱动语义漂移:
driver-memory(已核实代码路径)
memory-matcher.ts 对 $lte 是裸 JS 比较:
case'$lte':
if(!(value<=target))returnfalse;
存储值为 Date 或 ISO 字符串('2026-07-28T09:15:00.000Z')、target 为 '2026-07-28' 时,字符串序/coercion 都把当天 00:00 之后的值排除 —— 与 #3777 完全同构。memory-analytics.ts 把 dateRange 归一成 {$gte: v[0], $lte: v[1]}(约 L765/L864)后走同一匹配器,所以 窗口路径同样命中。$between(L126-129)同理。
driver-mongodb(推断,需验证)
$lte 直译给 Mongo。BSON Date 字段 vs 字符串 '2026-07-28' 是跨类型比较(BSON 类型序),行为更糟:可能整个窗口都不匹配而非只丢当天。需要按 #3777 的行结果探针实测。
建议落点
与 PR #4041 相同的规则与原语,不要新造判定:
验收
把 sql-driver-calendar-day-upper-bound.test.ts 的行结果探针(issue #3777 复现原样 + $gte/$gt/$lt 不变性 + 完整 ISO 不放宽)在两个驱动上各钉一份 —— 这也是 ADR-0053 D-A3 矩阵 driver 轴的两个格子(D-D2 已把 bound-semantics 轴写进 ADR)。
#3777 / PR #4041 把「裸
YYYY-MM-DD上界 = 含当天整天」的操作符敏感翻译落在了 SQL 驱动的比较发射点(SqlDriver.calendarDayUpperBoundRewrite,SqliteWasmDriver继承)与 analytics 策略层。非 SQL 驱动未对齐,同一 dashboard 换驱动语义漂移:driver-memory(已核实代码路径)
memory-matcher.ts对$lte是裸 JS 比较:存储值为
Date或 ISO 字符串('2026-07-28T09:15:00.000Z')、target 为'2026-07-28'时,字符串序/coercion 都把当天 00:00 之后的值排除 —— 与 #3777 完全同构。memory-analytics.ts把dateRange归一成{$gte: v[0], $lte: v[1]}(约 L765/L864)后走同一匹配器,所以 窗口路径同样命中。$between(L126-129)同理。driver-mongodb(推断,需验证)
$lte直译给 Mongo。BSON Date 字段 vs 字符串'2026-07-28'是跨类型比较(BSON 类型序),行为更糟:可能整个窗口都不匹配而非只丢当天。需要按 #3777 的行结果探针实测。建议落点
与 PR #4041 相同的规则与原语,不要新造判定:
nextUtcCalendarDay(@objectstack/core,两个包均已依赖或可依赖 core);$lte× datetime 字段 →< 次日午夜;$between裸日期 max 同样分解为半开;date字段、完整 ISO/Date比较值、$gte/$gt/$lt一律不动(dashboard 的日期区间上界打在datetime列上丢失当天数据 —— 默认配置即命中 #3777 语义表);initObjects拿到字段类型元数据,可按声明类型收窄;matcher 若拿不到类型,可用 PR fix(driver-sql,service-analytics): bare-day upper bounds cover the whole day on Field.datetime (#3777) #4041 中 preview-evaluator 的类型盲等价技巧(< 次日对 date 文本序等价于<= 当日)。验收
把
sql-driver-calendar-day-upper-bound.test.ts的行结果探针(issue #3777 复现原样 +$gte/$gt/$lt不变性 + 完整 ISO 不放宽)在两个驱动上各钉一份 —— 这也是 ADR-0053 D-A3 矩阵 driver 轴的两个格子(D-D2 已把 bound-semantics 轴写进 ADR)。