You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用LINQ查询Cosmos DB中指定日期范围的记录(生日场景)

解决Cosmos DB中未来30天生日查询及特定月份记录查询问题

一、修复未来30天生日查询逻辑

原代码仅通过匹配月份筛选,未考虑具体日期,会错误包含超出30天范围的生日(例如跨年场景下的下月下旬生日)。正确逻辑需基于UTC日期,构造用户生日的本年/下年对应日期,再判断是否落在[当前UTC时间, 当前UTC时间+30天]区间内。

修改后的查询代码

DateTime todayUtc = DateTime.UtcNow;
DateTime next30DaysUtc = todayUtc.AddDays(30);

var users = await _cosmosClient.GetByQuery(up => 
    users.Contains(up.UserId) && 
    up.Birthday.IsDefined() &&
    // 匹配本年范围内的生日
    (
        (up.Birthday.Month >= todayUtc.Month && up.Birthday.Day >= todayUtc.Day && 
         new DateTime(todayUtc.Year, up.Birthday.Month, up.Birthday.Day) >= todayUtc && 
         new DateTime(todayUtc.Year, up.Birthday.Month, up.Birthday.Day) <= next30DaysUtc)
        ||
        // 匹配跨年场景下的下一年生日
        (up.Birthday.Month < todayUtc.Month || (up.Birthday.Month == todayUtc.Month && up.Birthday.Day < todayUtc.Day) &&
         new DateTime(todayUtc.Year + 1, up.Birthday.Month, up.Birthday.Day) >= todayUtc && 
         new DateTime(todayUtc.Year + 1, up.Birthday.Month, up.Birthday.Day) <= next30DaysUtc)
    ),
    pk);

逻辑说明

  • 对于生日在本年剩余日期(月日≥当前月日):用本年年份构造日期,判断是否在30天范围内。
  • 对于生日在下一年(月日<当前月日,跨年场景):用下一年年份构造日期,判断是否在30天范围内。
  • 所有日期计算基于UTC,与Cosmos DB存储的UTC格式datetime完全对齐。

二、查询特定月份的记录

若需筛选特定UTC月份的生日,直接匹配Birthday.Month即可:

示例代码

int targetMonth = 10; // 目标UTC月份(1-12)
var usersInMonth = await _cosmosClient.GetByQuery(up => 
    up.Birthday.IsDefined() && 
    up.Birthday.Month == targetMonth,
    pk);

注意事项

  • 若业务需求是基于本地时间月份,需先将本地月份转换为对应的UTC月份(需考虑时区偏移),再执行筛选。

内容的提问来源于stack exchange,提问作者Bobby Jose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:40:17