maria和mssql时间类型区别
maria里面的datetime是可以设置长度的,默认是0.这个长度的影响范围是秒后面的
值,例如1999-01-01 10:10:10,这个时间对应的类型长度是datetime(0),如果设置成datetime(6),那么对应时间就是 1999-01-01 10:10:10.000000 ,秒后面又6个0.
sqlserver数据库中,datetime时间类型和maria的datetime以及datetime(6)是不能
等同的.sqlserver的datetime默认是带有3个毫秒值的,例如 1999-01-01 10:10:10.000 ,可以对应于maria的datetime(3).但是,sqlserver还由一个时间类型,datetime2(7),这个是可以设置长度的,比如datetime2(6),等同于maria的datetime(6).
c#的时间类型DateTime,可以对应使用mariadb的datetime(0~6).也可以对应
sqlserver的datetime和datetime2(0-7).可见,sqlserver可以有7位毫秒精度,maria最大是6位.不过,大多数系统是用不到的.
c#和mssql还有一个datetimeoffset(7)类型,对应的c#也有DateTimeOffset,这种是
带有时区的,1999-01-01 12:26:14.7466667 +08:00,那个(7)是可以设置长度的.
c#时间类型对应数据库时间类型,在存库时的测试
C#的DateTime,DateTimeOffset类型,插入到sqlserver的datetime,datetime2(0~7),datetimeoffset(0~7)的情况:
DateTime 是c#的一个时间类型,精确到毫秒7位数
以这个时间例子做插入测试: 1911-01-01 10:10:10.9725850
1. sqlserver的datetime默认保留3位毫秒,例子插入后变成 1911-01-01 10:10:10.973
2. datetime2(0),不要毫秒部分,插入后变成1911-01-01 10:10:11
3. datetime2(2),插入后变成1911-01-01 10:10:10.97
4. datetimeoffset(7),插入后,变成1911-01-01 10:10:10.9725850+00:00,因为C#DateTime类型不带时区,所以datetimeoffset类型没能得到时区值,默认设置00:00时区
sqlserver对插入的时间值做了4舍5入.当插入的时间不要毫秒部分时,例如datetime2(0),例子时间的毫秒部分9725850,会向前"5入"一秒,所以时间变成了1911-01-01 10:10:11.当插入时间毫秒部分保留n位(<=7n>=0)时,会将大于n位的部分4舍5入后丢弃.
DateTimeOffset是c#的一个时间类型,精确到毫秒7位数,并且带有时区
例子: 1911-01-01 10:10:10.0774912 +08:00
插入datetime,和datetime2(0~7)类型时,丢弃时区,4舍5入毫秒
插入datetimeoffset(0~7)类型时,时区保留,4舍5入毫秒
严格的说,对于DateTime类型,对应的数据库类型是datetime或者datetime2,DateTimeOffset则对应datetimeoffset(0~7)
对于存时间数据来说,C#用DateTime,DateTimeOffset,数据库类型用datetime,datetime2,datetimeoffset都可以容错
但读取数据时,如果数据库类型是datetimeoffset,而C#用了DateTime,那就会转换失败.offset有时区部分,而DateTime没有,
这两个类型的结构不同,反之数据库用datetime或者datetime2,C#用DateTimeOffset接收,也会失败.
所以C#用DateTimeOffset要对应用数据库的datetimeoffset类型,DateTime对应datetime或者datetime2
C#的DateTime,DateTimeOffset类型,插入到maria的datetime(0~6)的情况:
还是以这个时间例子做插入测试: 1911-01-01 10:10:10.9725850
DateTime
1. datetime(0)插入后值是1911-01-01 10:10:10 ,可见这个与sqlserver不同,没有4舍5入,而是直接丢弃毫秒部分了
2. datetime(5)插入后值是1911-01-01 10:10:10.97258,毫秒部分保留5位,多出的丢弃,不4舍5入.
DateTimeOffset
例子: 1911-01-01 10:10:10.0774912 +08:00
直接插入失败,maria的datetime(0~6)不能接受这样的时间,因为C#的DateTimeOffset与maria的datetime(0~6)格式不同,带了时区.所以不能支持.那么,对于maria数据库C#要使用DateTime类型才能匹配.