我正在将C# DateTime.MinValue
保存到timestamp with timezone
类型的PostgreSQL列,其中包含EFCore 7.05
和Ngpsql 7.04
Date = {1/01/0001 12:00:00 AM}
个Kind = Utc
个
当我加载列时,值变为
Date = {1/01/0001 12:00:00 AM}
个Kind = Unspecified
个
使用正确的DateTime.Kind值可以保存和加载其他非默认值。有谁知道EFCore,npgsql和Postgres中发生了什么?我该查哪个?
2条答案
按热度按时间jxct1oxe1#
DateTime.MinValue几乎从不用于表示实际的时间戳,而是一个比所有其他值都小的特殊标记或值。PostgreSQL中对应的值是
-infinity
,这就是Npgsql执行该转换的原因。转换是以两种方式执行的,一种是将DateTime.MinValue写入PG,另一种是从PG读取-infinity
作为.NET DateTime。请注意,DateTime.MinValue的Kind=Unspecified,而不是Utc;这就是为什么阅读-infinity会导致Kind=Unspecified。
请注意,可以通过特殊的兼容性开关禁用转换行为,但不建议这样做:这意味着您将在数据库中获得实际的时间戳1/1/0001,而不是-无穷大。
查看这些Npgsql文档以获取更多信息。
vd2z7a6w2#
可能是因为postgresql存储的最小值是公元前4713年1月1日,文档为here。
对于C#,最小日期是1/01/0001,记录在这里。
这可能导致DateTime.MinValue设置为Unspecified。