之前的一篇文章:C# DateTime类型保存到MySql数据库会四舍五入
实验一:
c#代码:
using (MESDB db = new MESDB())
{
var repair = new MesRepair()
{
F_ID = Guid.NewGuid().ToString(),
MachineNum = "666",
RepairEndTime = DateTime.Now,
};
var tempRepairEndTimeList = new List<DateTime>();
tempRepairEndTimeList.Add(repair.RepairEndTime.Value);
new StackRedisHelper().HashSet(
RedisCustomKey.TCPS_RealTimeMachineInfo + "666", "RepairEndTimeList",
tempRepairEndTimeList);
db.MesRepair.Add(repair);
db.SaveChanges();
}
如果SQLServer数据库设置为DateTime类型,C#代码中打断点可以看到 TimeOfDay 为
2021/07/29 14:32:34.5821524,则值会变成 2021/07/29 14.32.34.583。
using (MESDB db = new MESDB())
{
var repair = new MesRepair()
{
F_ID = Guid.NewGuid().ToString(),
MachineNum = "666",
RepairEndTime = Convert.ToDateTime("2021/07/29 14:32:34.5839524"),
};
db.MesRepair.Add(repair);
db.SaveChanges();
}
2021/07/29 14:32:34.5839524,则值会变成 2021/07/29 14.32.34.583。
这是因为:
SQLServer DateTime字段类型对应的时间格式是 yyyy-MM-dd HH:mm:ss.fff ,3个f,精确到千分之三秒,示例 2014-12-03 17:06:15.433 。(9、0、1) 会引起进0调整;(5、6、7、8)引起7调整;(2、3、4)引起3调整。
实验二:
C#代码:
using (MESDB db = new MESDB())
{
var repair = new MesRepair()
{
F_ID = Guid.NewGuid().ToString(),
MachineNum = "666",
RepairEndTime = Convert.ToDateTime("2021/07/29 14:32:34.5821524"),
};
var tempRepairEndTimeList = new List<DateTime>();
tempRepairEndTimeList.Add(repair.RepairEndTime.Value);
new StackRedisHelper().HashSet(
RedisCustomKey.TCPS_RealTimeMachineInfo + "666", "RepairEndTimeList",
tempRepairEndTimeList);
db.MesRepair.Add(repair);
db.SaveChanges();
}
如果SQLServer数据库设置为DateTime2类型,长度设为0,则值会变成14.32.35。
由实验二得出结论,C# DateTime类型保存到SqlServer数据库会四舍五入。
实验三:
c#代码不变。
如果SQLServer数据库设置为DateTime2类型,长度设为7,则值会变成14.32.34:5821524。
由实验三得出结论,C#DateTime类型精度可以精确到秒单位后7位。
实验四:
测试下在C#中输出的话DateTime类型的数值?
C#代码:
using (MESDB db = new MESDB())
{
var repair = new MesRepair()
{
F_ID = Guid.NewGuid().ToString(),
MachineNum = "666",
RepairEndTime = Convert.ToDateTime("2021/07/29 14:32:34.5821524"),
};
if (repair.RepairEndTime == Convert.ToDateTime("2021/07/29 14:32:34"))
{
Console.WriteLine("DateTime类型秒单位后7位不相同的情况下,相等");
}
if (repair.RepairEndTime.ToString() == "2021/7/29 14:32:34")
{
Console.WriteLine("DateTime类型秒单位后7位不相同的情况下,再ToString()相等");
}
var tempRepairEndTimeList = new List<DateTime>();
tempRepairEndTimeList.Add(repair.RepairEndTime.Value);
new StackRedisHelper().HashSet(
RedisCustomKey.TCPS_RealTimeMachineInfo + "666", "RepairEndTimeList",
tempRepairEndTimeList);
db.MesRepair.Add(repair);
db.SaveChanges();
}
VS编辑器调试如下:
由实验四得出结论:
c# DateTime类型在比较是否相等时候是会考虑秒单位后七位的。 而如果c# DateTime类型ToString()以后输出秒单位之前的,也不存在四舍五入。
某些业务场景需要用SQLSever存储DateTime类型字段的值的时候,后面需要取出DateTime类型字段的值与之前的DateTime类型字段的值是否相等的时候。因为DateTime类型保存到SqlServer数据库会四舍五入,就要把DateTime类型字段的值只截取到秒,秒后面的舍弃掉,存入到SqlServer数据库。