TypeORM(SQLite):QueryBuilder中datetime字段匹配日期忽略时间
解决TypeORM搭配SQLite时按日期(而非Datetime)匹配查询的问题
针对你的需求,这里有几种直接按日期匹配的方案:
方案1:使用SQLite的DATE()函数提取日期部分
直接利用SQLite内置的DATE()函数,将存储的datetime字段转换成纯日期格式(YYYY-MM-DD),再和传入的日期字符串比较,不需要转换为Date对象:
.andWhere("DATE(logs.log_date) = :log_date", { log_date: "2024-12-11" })
原理:DATE(logs.log_date)会自动把2024-12-11 00:00:00.000这类datetime值转换成2024-12-11,直接与你传入的日期字符串精确匹配。
方案2:查询当天时间范围
如果需要利用字段索引提升查询效率(函数可能导致索引失效),可以查询目标日期0点到次日0点的范围:
const targetDate = new Date("2024-12-11"); const nextDay = new Date(targetDate); nextDay.setDate(nextDay.getDate() + 1); .andWhere("logs.log_date >= :startDate AND logs.log_date < :endDate", { startDate: targetDate, endDate: nextDay })
这种方式会匹配所有2024-12-11当天的datetime记录,同时能利用log_date字段的索引(如果已创建)。
方案3:使用TypeORM函数表达式(链式调用风格)
如果你更倾向于TypeORM的链式API而非直接写SQL字符串,可以用function方法构建查询:
.andWhere(qb => qb .function("DATE", "string", "logs.log_date") .equals(":log_date"), { log_date: "2024-12-11" })
这种写法和方案1逻辑一致,但更贴合TypeORM的代码风格。
内容的提问来源于stack exchange,提问作者JustCoder
相关产品推荐
相关产品推荐

