如何在TYPO3 v11.5 Extbase仓库中使用WEEK()等SQL函数
TYPO3 v11.5 Extbase使用WEEK()函数筛选特定周数据的解决方法
直接在WHERE条件中调用WEEK()函数
不需要额外选择周数字段,利用表达式构建器的custom()方法传入SQL函数片段,避免被自动转义:
$queryBuilder = $this->connectionPool->getQueryBuilderForTable($this->getTableName()); $queryBuilder->select('*') ->where( $queryBuilder->expr()->eq( $queryBuilder->expr()->custom('WEEK(myDateTime)'), $queryBuilder->createNamedParameter($pWeek, \PDO::PARAM_INT) ) );
custom()方法会保留传入的SQL片段原样,不会添加反引号转义,确保WEEK(myDateTime)能被数据库正确识别并执行计算,再与参数$pWeek做等值匹配。
需要返回周数字段的写法
如果要把周数作为查询结果的一部分返回,使用addSelectLiteral()方法(TYPO3 v10及以上版本支持),该方法专门处理无需转义的SQL表达式:
$queryBuilder = $this->connectionPool->getQueryBuilderForTable($this->getTableName()); $queryBuilder->select('*') ->addSelectLiteral('WEEK(myDateTime) AS week') ->where( $queryBuilder->expr()->eq( $queryBuilder->expr()->custom('WEEK(myDateTime)'), $queryBuilder->createNamedParameter($pWeek, \PDO::PARAM_INT) ) );
额外提示
- 不同数据库的
WEEK()函数参数逻辑可能有差异(比如MySQL的周计算模式),需根据使用的数据库调整函数写法。 - 处理跨年周场景时,建议结合年份判断,例如用
CONCAT(YEAR(myDateTime), '-', WEEK(myDateTime)),避免周数重复导致的筛选错误。
内容的提问来源于stack exchange,提问作者Doku
相关产品推荐
相关产品推荐

