uni-app unicloud的dbcmd.gte和gt无法对日期做出正确判断

发布于 1周前 作者 gougou168 来自 Uni-App

uni-app unicloud的dbcmd.gte和gt无法对日期做出正确判断

示例代码:

db.collection("total").where({  
    salesperson: this.val_1,  
    type: db.command.in(this.selected),  
    documentDate: dbCmd.gte("2023-10-1")  
})

只会查询出大于10日的

db.collection("total").where({  
    salesperson: this.val_1,  
    type: db.command.in(this.selected),  
    documentDate: dbCmd.gte("2023-9-1")  
})

直接没有任何返回

操作步骤:

db.collection("total").where({  
    salesperson: this.val_1,  
    type: db.command.in(this.selected),  
    documentDate: dbCmd.gte("2023-10-1")  
})

预期结果:

返回大于等于1日的数据且月份不是本月也能返回

实际结果:

返回大于10日或不返回

bug描述:

我的代码如下

db.collection("total").where({  
    salesperson: this.val_1,  
    type: db.command.in(this.selected),  
    documentDate: dbCmd.gte("2023-10-1")  
})

我的数据库有20条符合上述条件的数据(10月4-29的数据),但是dbCmd.gte("2023-10-1")查询出的只有比10月且10号大的数据,而且当值为2023-9-1时也就是不是数据符合的月份便不返回数据,但是lte是没问题的dbCmd.lte("2023-11-30")能返回20条数据


2 回复

千万不要用字符串的日期格式来判断大小,举个例子,你用js写 console.log(“2023-10-1” > “2023-9-1”) 最终打印的结果就是false
时间判断大小建议存时间戳,用时间戳来比较大小是没问题的


在 UniApp 中使用 UniCloud 的 dbcmd.gtedbcmd.gt 对日期进行判断时,可能会遇到无法正确判断的问题。这通常是由于日期格式或数据类型不一致导致的。以下是一些可能的原因和解决方案:

1. 确保日期格式一致

UniCloud 的数据库操作中,日期字段通常以 Date 类型存储。如果你在查询时使用了字符串格式的日期,可能会导致比较操作失败。

解决方案: 确保你在查询时使用的日期是 Date 类型,而不是字符串。例如:

const db = uniCloud.database();
const date = new Date('2023-10-01');

db.collection('yourCollection')
  .where({
    dateField: dbcmd.gte(date)
  })
  .get()
  .then(res => {
    console.log(res);
  })
  .catch(err => {
    console.error(err);
  });

2. 检查时区问题

日期比较可能会受到时区的影响。如果你在存储和查询时使用了不同的时区,可能会导致比较结果不符合预期。

解决方案: 确保在存储和查询时使用相同的时区。你可以使用 Date 对象的 toISOString() 方法将日期转换为 ISO 格式的字符串,以避免时区问题。

const date = new Date('2023-10-01T00:00:00Z'); // 使用 UTC 时间

3. 使用 dbcmd.date 进行日期比较

UniCloud 提供了 dbcmd.date 方法,可以用于处理日期比较。

解决方案: 使用 dbcmd.date 来确保日期比较的正确性。

const db = uniCloud.database();
const date = new Date('2023-10-01');

db.collection('yourCollection')
  .where({
    dateField: dbcmd.gte(dbcmd.date(date))
  })
  .get()
  .then(res => {
    console.log(res);
  })
  .catch(err => {
    console.error(err);
  });

4. 检查数据库中的日期字段类型

确保数据库中的日期字段类型是 Date,而不是字符串或其他类型。

解决方案: 在 UniCloud 控制台中检查你的集合字段类型,确保日期字段的类型是 Date

5. 使用 dbcmd.and 进行复杂日期比较

如果你需要进行更复杂的日期比较(例如同时使用 gtelt),可以使用 dbcmd.and 来组合多个条件。

const db = uniCloud.database();
const startDate = new Date('2023-10-01');
const endDate = new Date('2023-10-31');

db.collection('yourCollection')
  .where({
    dateField: dbcmd.and(
      dbcmd.gte(startDate),
      dbcmd.lt(endDate)
    )
  })
  .get()
  .then(res => {
    console.log(res);
  })
  .catch(err => {
    console.error(err);
  });
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!