基于折扣日期动态切换筛选列的PostgreSQL/TypeORM WHERE实现
原生SQL实现
核心逻辑是动态判断当前日期是否处于折扣有效期内,选择对应的价格字段进行区间筛选。以下是通用写法,注意不同数据库的当前日期函数略有差异:
SELECT * FROM your_table_name WHERE CASE WHEN CURRENT_DATE BETWEEN discount_start_date AND discount_end_date THEN discounted_price ELSE price END BETWEEN :min_price AND :max_price;
- 数据库适配提示:
- MySQL/MariaDB:用
CURDATE()代替CURRENT_DATE - PostgreSQL:
CURRENT_DATE或NOW()::DATE - SQL Server:
GETDATE()或CAST(GETDATE() AS DATE)
- MySQL/MariaDB:用
- 替换
your_table_name为实际表名,:min_price和:max_price为目标价格区间上下限,字段名(如discounted_price)需与数据库实际命名一致(建议用下划线分隔,避免空格)。
TypeORM实现
提供两种常用实现方式:
方式1:QueryBuilder(推荐,灵活性高)
import { getRepository } from "typeorm"; import { YourEntity } from "./entities/your-entity.entity"; async function filterProducts(minPrice: number, maxPrice: number) { const result = await getRepository(YourEntity) .createQueryBuilder("product") .where(` CASE WHEN CURRENT_DATE BETWEEN product.discount_start_date AND product.discount_end_date THEN product.discounted_price ELSE product.price END BETWEEN :minPrice AND :maxPrice `) .setParameters({ minPrice, maxPrice }) .getMany(); return result; }
方式2:Raw函数结合find方法
import { getRepository } from "typeorm"; import { YourEntity } from "./entities/your-entity.entity"; import { Raw } from "typeorm"; async function filterProducts(minPrice: number, maxPrice: number) { const result = await getRepository(YourEntity).find({ where: Raw(alias => ` CASE WHEN CURRENT_DATE BETWEEN ${alias}.discount_start_date AND ${alias}.discount_end_date THEN ${alias}.discounted_price ELSE ${alias}.price END BETWEEN ${minPrice} AND ${maxPrice} `) }); return result; }
- 注意事项:
- 替换
YourEntity为实际实体类,实体字段名需与数据库字段对应(若用@Column指定了数据库字段名,需匹配该名称) - 根据使用的数据库替换
CURRENT_DATE为对应日期函数
- 替换
内容的提问来源于stack exchange,提问作者Hassan Aref
相关产品推荐
相关产品推荐

