自定义 Grid 平时能打开,一选日期范围就报 SQL ambiguous column 或格式错误,常见原因是 collection join 后同名字段没有映射,或者 UI Component 把日期按 UTC 转换后传给了不合适的表达式字段。

先把失败请求里的filters参数留下来

在 mui/index/render 请求中找到 filters[created_at][from] 和 to,再把 collection 生成的 SQL 打到日志:

$this->logger->debug((string) $collection->getSelect());

如果 join 的两张表都有 created_at,给 filter 建立明确映射:

$collection->addFilterToMap('created_at', 'main_table.created_at');

Grid XML 中也让列名对应 collection 可过滤字段,不要显示别名 A,却让 DataProvider 对不存在的别名 B 做 WHERE。

日期列的dataType和timezone要按存储值设置

Magento 数据库里的标准时间通常按 UTC 保存,UI 日期列可配置:

<column name="created_at" class="MagentoUiComponentListingColumnsDate">
    <settings>
        <filter>dateRange</filter>
        <dataType>date</dataType>
        <label translate="true">Created At</label>
    </settings>
</column>

如果字段保存的是商店本地时间或纯日期,就不要照抄带时区转换的配置。测试时用跨午夜的数据,分别筛选单日和跨日范围,检查边界记录是否被错误排除。SQL 不报错只是第一步,日期范围与后台显示的时区一致才算完成。