You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.Net(Dapper)向PostgreSQL保存DateTimeOffset时丢失一位精度

问题分析与解决

原始对象的时间值:2024-02-27 21:42:43.7125911 +0h
读取后的时间值:2024-02-27 21:42:43.712591 +0h

原因

PostgreSQL 默认的 timestamptz(带时区时间戳)类型仅支持6位微秒精度,但 .NET 的 DateTimeOffset 原生支持7位精度(对应100纳秒粒度)。当你把DateTimeOffset写入数据库时,数据库会自动截断超出6位的小数部分,所以读取回来的时间戳会少最后一位数字。

解决方法

方案1:接受精度截断(大多数场景够用)

6位微秒精度(1微秒=1000纳秒)已经能满足绝大多数业务的时间精度要求,如果你的业务不需要100纳秒级别的精度,直接用默认的timestamptz类型就行,不用额外处理。

方案2:保留完整7位精度(高精度需求场景)

如果必须保留DateTimeOffset的完整精度,需要修改数据库字段的类型,显式指定7位精度:

ALTER TABLE 你的表名 ALTER COLUMN dateTimeOffset TYPE timestamp(7) with time zone;

修改后,Dapper 会通过 PostgreSQL 的 .NET 驱动(Npgsql)自动适配timestamp(7) with time zone和DateTimeOffset的映射,读写时就能完整保留7位小数的时间戳。


内容的提问来源于stack exchange,提问作者Kate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:37:50