C# DateTime类型与数据库的DateTime类型解惑篇

之前的一篇文章: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数据库。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
字段的值是如何存储的?如何在代码操作和显示这些值? 回答: 在数据库datetime字段的值以特定的格式存储。具体格式取决于数据库类型和配置。在代码,可以使用datetime类来操作和显示这些值。可以通过创建datetime对象来表示时间,并使用对象的方法和属性来显示时间。在C#,可以使用DateTime.Now来获取当前时间,或者使用DateTime.UtcNow来获取当前的UTC时间。另外,还可以使用DateTime构造函数来创建一个指定日期和时间的对象,通过传入年、月、日、时、分、秒和毫秒等参数来指定具体的时间。在数据库操作,可以将datetime对象赋值给数据库字段,或者从数据库读取datetime字段的值并转换为datetime对象进行操作。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [datetime库的使用方法](https://blog.csdn.net/m0_68795816/article/details/126794074)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C# DateTime类型数据库DateTime类型解惑](https://blog.csdn.net/weixin_46879188/article/details/119210317)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值