类型规则。通过日期查询时仅使用日期部分并排除时间戳部分

Typeorm. use only the date part while querying via date and exclude the timestamp part

我有一个用例,我必须通过他的出生日期从数据库中检索用户记录。 问题是我们将用户的出生日期存储为 datetime 对象,这使得检索用户数据变得非常困难,因为我们无法提供带时间戳的确切日期。

我尝试在 typeorm 中寻找一个函数支持,使用它我可以将提供的日期与数据库中出生日期的日期部分进行比较,但没有在任何地方找到任何参考。

找到解决办法了,其实我们可以使用LIKE操作符,唯一的前提是我们必须将日期转换成字符串,

类似

date_of_birth::text LIKE '2011-01-%'

不要将您的列转换为字符串。这是使用 date/datetime/timestamp.

的方法
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;

您可以使用查询生成器和 postgresql DATE_TRUNC() 函数:

const usersBornToday = await getManager()
    .createQueryBuilder(User, "user")
    .where(`DATE_TRUNC('day', "birthdatetime") = :date`, {date: '2021-03-27'})
    .getMany()

如果数据库类型是MySQLCONVERT函数将实现与@Vijender使用的相同方法,即将时间戳转换为文本,如下所示:

let date = '2022-01-25'; //yyyy-mm-dd, for Regex validation - /\d{4}\-\d{2}\-\d{2}/
date = `${date}%`;
queryResult.where('CONVERT(date_of_birth, char) LIKE :date', { date });

Todo:only show today stock list
      const start = moment().startOf('day').toDate();
      const end = moment().endOf('day').toDate();
     
      const query=getManger()
        .createQueryBuilder(stocks, 'stocks')
        .andWhere('stocks.createdAt BETWEEN :start AND :end', { start, end })