Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不降低精度的情况下在PostgreSQL中存储DateTime_C#_Postgresql_Datetime_Timestamp - Fatal编程技术网

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
    的正确方法是什么,这样我就不会失去任何精度
  • 我正在考虑将UNIX毫秒数保存到
    整数
    字段中,而不是将
    日期时间
    保存为
    时间戳
    ,即:

    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 };
    
  • 或者,如何以尽可能高的精度(C#/PostgreSql)比较2个日期时间
  • 我目前的解决方案是可行的。。但我在这里失去了太多的精确性:

    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
    属性中