V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
edis0n0
V2EX  ›  程序员

EF Core 每月第一天统计出的当日订单数都比当月订单还多,是哪里出了问题?

  •  
  •   edis0n0 · 2023-03-02 00:50:00 +08:00 · 1032 次点击
    这是一个创建于 618 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个系统好几年了一直有这个 Bug ,没人修,我一下子也没看出问题,问题代码等效如下:

    var thisMonthOrder = _context.Orders.Where(x => x.CreatedAt >= DateTimeOffset.Parse($"{DateTimeOffset.Now.Month.ToString()}/1/{DateTimeOffset.Now.Year.ToString()}")).Count();
    var todayOrder = _context.Orders.Where(x => x.CreatedAt >= DateTimeOffset.Now.Date).Count();
    

    请大佬帮忙看看。

    6 条回复    2023-03-02 09:33:35 +08:00
    Rocketer
        1
    Rocketer  
       2023-03-02 00:54:36 +08:00 via iPhone
    考虑一下时区问题?
    clorischan
        2
    clorischan  
       2023-03-02 01:28:42 +08:00
    那么问题来了
    哪个是对的, 本月数量是对的还是当日数量是对的
    netnr
        3
    netnr  
       2023-03-02 05:56:40 +08:00
    var now = DateTime.Now; //now = DateTime.UtcNow;
    var firstDay = now.AddDays(1 - now.Day);

    var query1 = _context.Orders.Where(x => x.CreatedAt >= now.Date);
    var query2 = _context.Orders.Where(x => x.CreatedAt >= firstDay.Date);

    可能是第一个查询转日期的问题?
    ragnaroks
        4
    ragnaroks  
       2023-03-02 08:32:45 +08:00
    DateTimeOffset.Parse 需要正确传递第 2 个参数 IFormatProvider ,如果你是使用 "MM/D/YYYY" 格式的区域就用 DateTimeFormatInfo.CurrentInfo 否则应当使用 "YYYY-MM-DD" 格式和 DateTimeFormatInfo.InvariantInfo
    ragnaroks
        5
    ragnaroks  
       2023-03-02 08:33:55 +08:00
    我最早注意到此类问题是很久以前在国内做的开源项目,老外拿去用发现数字处理非常诡异
    jatsz
        6
    jatsz  
       2023-03-02 09:33:35 +08:00
    打一个日志看下生成的 SQL
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1136 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:45 · PVG 02:45 · LAX 10:45 · JFK 13:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.