Bit Framework中如何仅按日期过滤数据而不比较时间?
解决OData中仅按日期比较的问题
哎,这个坑我踩过!问题出在你直接用==比较的时候,dateToSearch默认会带时分秒(哪怕你只传了年月日,它的时间部分是00:00:00),但数据库里的BirthDate字段大概率存储了具体的时间戳(比如1990-01-01T14:30:00),所以精确匹配自然返回空结果。下面给你两种通用的解决办法:
方法1:使用OData日期函数提取年月日分别比较
OData标准支持year()、month()、day()这些函数,可以直接从日期字段中提取对应的部分,忽略时间戳进行比较:
// 日期选择器选中了2017年9月5日 const dateToSearch = new Date(2017, 8 /*月份从0开始*/, 5); const targetYear = dateToSearch.getFullYear(); const targetMonth = dateToSearch.getMonth() + 1; // OData的month是1-12,JS是0-11,要加1转换 const targetDay = dateToSearch.getDate(); // context是OData上下文 const customersOfThatSpecificDay = await context.customers .filter(`year(BirthDate) eq ${targetYear} and month(BirthDate) eq ${targetMonth} and day(BirthDate) eq ${targetDay}`) .toArray();
这种方式逻辑直观,适合需要明确拆分日期部分的场景。
方法2:使用范围查询(推荐,性能更优)
如果你的数据库对BirthDate字段建了索引,这种范围查询的性能会更好。思路是查询BirthDate大于等于目标日期的0点,同时小于下一天的0点,这样就能覆盖目标日期所有时间的记录:
// 日期选择器选中了2017年9月5日 const dateToSearch = new Date(2017, 8 /*月份从0开始*/, 5); // 构造目标日期的00:00:00 const startOfDay = new Date(dateToSearch.getFullYear(), dateToSearch.getMonth(), dateToSearch.getDate()); // 构造下一天的00:00:00 const startOfNextDay = new Date(startOfDay); startOfNextDay.setDate(startOfNextDay.getDate() + 1); // context是OData上下文 const customersOfThatSpecificDay = await context.customers .filter(`BirthDate ge ${startOfDay.toISOString()} and BirthDate lt ${startOfNextDay.toISOString()}`) .toArray();
这里用toISOString()把日期转成OData支持的标准格式,确保查询语法正确。
内容的提问来源于stack exchange,提问作者Ramin Pedram
相关产品推荐
相关产品推荐

