C# 在不降低精度的情况下在PostgreSQL中存储DateTime
我一直在琢磨一个问题,即每当我从C# 在不降低精度的情况下在PostgreSQL中存储DateTime,c#,postgresql,datetime,timestamp,C#,Postgresql,Datetime,Timestamp,我一直在琢磨一个问题,即每当我从Postgresql数据库加载一个大概是DateTime的数据,并将其与C#中的初始值进行比较时,数据就不匹配。例如,这里有一个C#中的原始DateTime: 日期:{09.07.2018 00:00:00} 滴答声:636667391123714378 时间:{13:18:32.3714378} 同一日期,从DB返回(保存后): 日期:{09.07.2018 00:00:00} 滴答声:636667391123714370 时间:{13:18:32.371437
Postgresql
数据库加载一个大概是DateTime
的数据,并将其与C#中的初始值进行比较时,数据就不匹配。例如,这里有一个C#中的原始DateTime
:
日期:{09.07.2018 00:00:00}
滴答声:636667391123714378
时间:{13:18:32.3714378}
同一日期,从DB
返回(保存后):
日期:{09.07.2018 00:00:00}
滴答声:636667391123714370
时间:{13:18:32.3714370}
似乎在保存时-DateTime
已经失去了一些精度。数据库中的列类型是时间戳。因此,有两个问题:
PostgreSQL
中存储DateTime
的正确方法是什么,这样我就不会失去任何精度整数
字段中,而不是将日期时间
保存为时间戳
,即:
DateTime myDT = DateTime.Now;
long ms = new DateTimeOffset(myDT).ToUnixTimeMilliseconds();
// how I do it now
var parameterOld =
new Npgsql.NpgsqlParameter("dateInserted", NpgsqlTypes.NpgsqlDbType.Timestamp) {Value = myDT };
// how I think would be a better approach
var parameterNew =
new Npgsql.NpgsqlParameter("dateInserted", NpgsqlTypes.NpgsqlDbType.Integer) { Value = ms };
public static bool IsEqualWithLossOfPrecision(this DateTime timestamp1, DateTime timestamp2)
{
return (
timestamp1.Year == timestamp2.Year &&
timestamp1.Month == timestamp2.Month &&
timestamp1.Day == timestamp2.Day &&
timestamp1.Hour == timestamp2.Hour &&
timestamp1.Minute == timestamp2.Minute &&
timestamp1.Millisecond == timestamp2.Millisecond
);
}
欢迎对2个问题提出任何建议
我使用的是DB(10.4)的最新可用版本,
Npgsql
library v。4.0.0、.net framework 4.5ish、windows 10的PostgreSQL时间戳的精度限制为微秒
如果需要更多,请将纳秒存储在单独的
bigint
属性中。PostgreSQL的时间戳的精度限制为微秒
如果需要更多,请将纳秒存储在单独的bigint
属性中