在PostgreSQL中存储DateTime而不损失精度

时间:2018-06-29 14:06:58

标签: c# postgresql datetime timestamp

我遇到了一个问题,那就是每当我从DateTime数据库加载大概是Postgresql的数据并将其与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失去了一些精度。数据库中的列类型为Timestamp。因此,有2个问题:

  1. DateTime中存储PostgreSQL的正确方法是什么,因此我不会失去任何精度?

我正在考虑将多个UNIX毫秒保存到Integer字段中,而不是将DateTime保存为Timestamp,即:

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 };
  1. 或者,如何比较两个日期时间的精度最高(C#/ PostgreSql)?

我当前的解决方案是可行的。但是我在这里失去了太多的精度:

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库v.4.0.0,.net framework 4.5ish,Windows 10

1 个答案:

答案 0 :(得分:0)

PostgreSQL的时间戳的精度限制为微秒。

如果需要更多,请将纳秒存储在单独的bigint属性中。