C# DateTime.MinValue由PostgreSQL、EFCore或Npgsql处理的方式不同?

yzckvree  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(135)

我正在将C# DateTime.MinValue保存到timestamp with timezone类型的PostgreSQL列,其中包含EFCore 7.05Ngpsql 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中发生了什么?我该查哪个?

jxct1oxe

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文档以获取更多信息。

vd2z7a6w

vd2z7a6w2#

可能是因为postgresql存储的最小值是公元前4713年1月1日,文档为here
对于C#,最小日期是1/01/0001,记录在这里。
这可能导致DateTime.MinValue设置为Unspecified。

相关问题