数据库时间类型

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类型才能匹配.

posted @ 2021-09-11 10:46  mirrorspace  阅读(935)  评论(0编辑  收藏  举报