postgresql 无法在typeorm中查询具有时间戳类型的createdAt列的记录

t2a7ltrp  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(177)

` export抽象类GeneralEntity extends BaseEntity {

@PrimaryGeneratedColumn()
    id: number;

@CreateDateColumn({ name: 'createdAt' })
    createdAt: Date;

@UpdateDateColumn({ name: 'updatedAt' })
    updatedAt: Date;

@DeleteDateColumn({ name: 'deletedAt' })
    deletedAt: Date;

}`
这是我正在使用的一个实体。当我试图从这个实体中检索数据与特定的创建日期,日期我给不匹配,即使它是相同的。

const bookedRoomEntities = await this.createQueryBuilder('booking')                 
    .where(`booking.roomId = :roomId`, { roomId })                 
    .andWhere(`booking.createdAt = :date`, { date: format(date, 'yyyy-MM-dd HH:mm:ss') })                 
    .orderBy('booking.start')                 
    .getMany();

bookedRoomEntities
这始终是一个空数组。

const bookedRoomEntities = await this.createQueryBuilder('booking')                        
    .where(`booking.roomId = :roomId`, { roomId })                  
    .andWhere(`booking.createdAt = :date`, { date: format(date, 'yyyy-MM-dd HH:mm:ss') })                  
    .orderBy('booking.start') 
    .getMany();

它不应该是一个空数组。
任何帮助是赞赏!

vfwfrxfs

vfwfrxfs1#

在查询中,您将booking.createdAt与格式化的日期字符串进行比较。这可能会返回不正确的值,因为它可能会比较两个日期字符串,如下所示:

  • 2023-06-18 12:00:00(您的输入日期)
  • 2023-06-18 12:00:00.123(数据库中存储的日期)

下面是一个可能的解决方案,如果你想比较到秒(忽略毫秒),那么就使用DATE(booking.createdAt):

const bookedRoomEntities = await this.createQueryBuilder('booking')
    .where(`booking.roomId = :roomId`, { roomId })
    .andWhere(`date_trunc('second', booking.createdAt) = :date`, { date: format(date, 'yyyy-MM-dd HH:mm:ss') }) 
    .orderBy('booking.start')
    .getMany();

仅比较日期部分(将时间戳转换为日期):

const bookedRoomEntities = await this.createQueryBuilder('booking')
    .where(`booking.roomId = :roomId`, { roomId })
    .andWhere(`booking.createdAt::DATE = :date`, { date: format(date, 'yyyy-MM-dd') }) 
    .orderBy('booking.start')
    .getMany();

相关问题