当数据在数据库中持续存在时,实体框架DateTime有毫秒差



我将DateTime保存在表中,然后在where子句中使用相同的DateTime对象进行查询,结果为null。我注意到C#DateTime对象和数据库中存储的日期之间存在以毫秒为单位的差异。

注意:限制是由于某些原因,我必须使用DateTime来检索记录。

以下是用于保存和检索同一记录的C#代码。

DateTime startTime= DateTime.Now;
// startTime Object Details 
//Date                {9/9/2020 12:00:00 AM}
//Day                 8 
//DayOfWeek           Tuesday
//DayOfYear           252
//Hour                13 
//Kind                Local
//Millisecond         221
//Minute              40
//Month               9
//Second              30
//Year                2020

BATCH_JOB_EXECUTION bjeToAdd = new BATCH_JOB_EXECUTION();
bjeToAdd.JOB_NAME = "POPULATE_TRAN_SUMMARY";
bjeToAdd.START_TIME = startTime;

context.BATCH_JOB_EXECUTION.Add(bjeToAdd);
context.SaveChanges();

此时,数据将保存在数据库中。在使用SQLSELECT * FROM BATCH_JOB_EXECUTION查询数据库时,值START_TIME列为2020-09-08 13:40:30.223。请注意以毫秒为单位的221223的差异。现在C#代码继续如下:

// startTime object is not changed millisecond of this startTime Object is 221 !! 
var bjeToUpdate = (from batch in context.BATCH_JOB_EXECUTION
where batch.START_TIME == startTime
select batch).FirstOrDefault();

// bjeToUpdate is null  

以下是一些查询及其在评论中的行为:

SELECT * FROM BATCH_JOB_EXECUTION WHERE START_TIME = '2020-09-08 13:40:30.225' // No record found
SELECT * FROM BATCH_JOB_EXECUTION WHERE START_TIME = '2020-09-08 13:40:30.224' // Record Found. START_TIME is 2020-09-08 13:40:30.223
SELECT * FROM BATCH_JOB_EXECUTION WHERE START_TIME = '2020-09-08 13:40:30.223' // Record Found. START_TIME is 2020-09-08 13:40:30.223
SELECT * FROM BATCH_JOB_EXECUTION WHERE START_TIME = '2020-09-08 13:40:30.222' // Record Found. START_TIME is 2020-09-08 13:40:30.223
SELECT * FROM BATCH_JOB_EXECUTION WHERE START_TIME = '2020-09-08 13:40:30.221' // No record Found

现在,通过观察这种奇怪的行为,我想知道以下

  1. 为什么要保存的C#DateTime对象和数据库字段中存在毫秒差异。

  2. 观察SQL查询为什么SQL会有这种行为来获取差异为001毫秒的记录。

来自datetime:的文档

精度:四舍五入到.000、.003或.007秒的增量

如果您确实需要该级别的准确性,可以改用datetime2数据类型。医生说:

精度:100纳秒

最新更新