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

2023-03-02 00:50:00 +08:00
 edis0n0

这个系统好几年了一直有这个 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();

请大佬帮忙看看。

1032 次点击
所在节点    程序员
6 条回复
Rocketer
2023-03-02 00:54:36 +08:00
考虑一下时区问题?
clorischan
2023-03-02 01:28:42 +08:00
那么问题来了
哪个是对的, 本月数量是对的还是当日数量是对的
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
2023-03-02 08:32:45 +08:00
DateTimeOffset.Parse 需要正确传递第 2 个参数 IFormatProvider ,如果你是使用 "MM/D/YYYY" 格式的区域就用 DateTimeFormatInfo.CurrentInfo 否则应当使用 "YYYY-MM-DD" 格式和 DateTimeFormatInfo.InvariantInfo
ragnaroks
2023-03-02 08:33:55 +08:00
我最早注意到此类问题是很久以前在国内做的开源项目,老外拿去用发现数字处理非常诡异
jatsz
2023-03-02 09:33:35 +08:00
打一个日志看下生成的 SQL

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/920313

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX