打字机。通过日期查询时仅使用日期部分并排除时间戳部分
Posted
技术标签:
【中文标题】打字机。通过日期查询时仅使用日期部分并排除时间戳部分【英文标题】:Typeorm. use only the date part while querying via date and exclude the timestamp part 【发布时间】:2020-10-07 10:44:56 【问题描述】:我有一个用例,我必须通过他的出生日期从数据库中检索用户记录。 问题是我们将用户的出生日期存储为 datetime 对象,这使得检索用户数据变得非常困难,因为我们无法提供带有时间戳的确切日期。
我尝试在 typeorm 中寻找功能支持,使用它我可以仅将提供的日期与数据库中出生日期的日期部分进行比较,但在任何地方都没有找到任何参考。
【问题讨论】:
问题不清楚,一方面你说:“我必须通过他的出生日期从数据库中检索用户记录”这意味着你有出生日期,但你说你没有。你到底想做什么?获取在特定日期出生的所有用户?如果两个用户在同一天出生怎么办? @NirAlfasi 我们在数据库中有日期时间格式的 DOB,但是当我们从前端查询它时,我们只是发送 dd-mm-yy。所以查询不会过滤掉记录。无论如何,我找到了解决方案并将其添加为下面的答案。 这不可能是问题的解决方案(正如我所说的那样),因为正如我上面提到的,可能有多个客户具有相同的 DOB。 【参考方案1】:找到解决办法,我们其实可以使用LIKE操作符,唯一的前提是我们必须将日期转换为字符串,
类似
date_of_birth::text LIKE '2011-01-%'
【讨论】:
【参考方案2】:不要将您的列转换为字符串。以下是使用日期/日期时间/时间戳的方法。
import startOfDay, endOfDay from 'date-fns';
import Between, Equal from "typeorm";
//...
let findArgs =
where:
date: Between(startOfDay(webInputArgs.date).toISOString(), endOfDay(webInputArgs.date).toISOString()),
userId: Equal(ctx.req.session.userId)
;
return entity.find(findArgs) as any;
【讨论】:
【参考方案3】:您可以使用查询生成器和 postgresql DATE_TRUNC()
函数:
const usersBornToday = await getManager()
.createQueryBuilder(User, "user")
.where(`DATE_TRUNC('day', "birthdatetime") = :date`, date: '2021-03-27')
.getMany()
【讨论】:
这正是我所需要的,谢谢!此外,如果有人希望通过 javascript Date 对象使日期参数动态化,您可以使用.where(`DATE_TRUNC('day', "birthdatetime") = :date`, date: yourDateObject.toISOString().split('T')[0] )
【参考方案4】:
如果DB类型为mysql
,CONVERT
函数将实现与@Vijender相同的方法,将时间戳转换为文本,如下所示:
let date = '2022-01-25'; //yyyy-mm-dd, for Regex validation - /\d4\-\d2\-\d2/
date = `$date%`;
queryResult.where('CONVERT(date_of_birth, char) LIKE :date', date );
【讨论】:
以上是关于打字机。通过日期查询时仅使用日期部分并排除时间戳部分的主要内容,如果未能解决你的问题,请参考以下文章
是否可以按主键的一部分对 DQL 查询进行分组并返回具有 max() 日期时间记录(早于参考日期)的记录?