You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于折扣日期动态切换筛选列的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)
  • 替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:30:53