所以你向下滚动是因为答案不起作用:
这很神奇(但他们说它对大数据有效率问题,而且你和我一样不在乎)
1- 就我而言,数据库中的数据类型是“日期时间”和“可空”。
DB 中的示例数据格式如下:
2018-11-06 15:33:43.640
在 C# 中转换为字符串时是这样的:
2019-01-03 4:45:16 PM
所以格式是:
yyyy/MM/dd hh:mm:ss tt
2- 所以你需要首先以正确的格式准备你的日期时间变量:
示例 1
yourDate.ToString("yyyy/MM/dd hh:mm:ss tt")
示例 2 - 过去 30 天的日期时间范围
DateTime dateStart = DateTime.Now.AddDays(-30);
DateTime dateEnd = DateTime.Now.AddDays(1).AddTicks(-1);
3- 最后是您浪费一天时间寻找的 linq 查询(需要 EF 6)
using System.Data.Entity;
_dbContext.Shipments.Where(s => (DbFunctions.TruncateTime(s.Created_at.Value) >= dateStart && DbFunctions.TruncateTime(s.Created_at.Value) <= dateEnd)).Count();
还要考虑时间比较:
(DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) >= dateStart && DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) <= dateEnd)
注意其他stackoverflow问题和答案中提到的以下方法将无法正常工作:
....
&&
(
s.Created_at.Value.Day >= dateStart.Day && s.Created_at.Value.Day <= dateEnd.Day &&
s.Created_at.Value.Month >= dateStart.Month && s.Created_at.Value.Month <= dateEnd.Month &&
s.Created_at.Value.Year >= dateStart.Year && s.Created_at.Value.Year <= dateEnd.Year
)).count();
如果开始日在本月,结束日在下个月,则查询将返回 false 且无结果,例如:
DatabaseCreatedAtItemThatWeWant = 2018/12/05
开始日期 = 2018/12/01
结束日期 = 2019/01/04
查询将始终搜索 01 和 04 之间的天而不考虑“月份”,因此“s.Created_at.Value.Day
如果你有非常大的数据,你会执行 Native SQL Query 而不是 linq
...
... where Shipments.Created_at BETWEEN CAST(@Created_at_from as datetime) AND CAST(@Created_at_to as datetime))
....
谢谢