保存 C# 日期时间时感到困惑?到 PostgreSQL 日期列(通过 dapper 和 npgsql)

问题描述 投票:0回答:1

有人可以解释一下为什么在通过 dapper 和 npgsql 将 C# 日期时间转换为字符串之前将其传递到 PostgreSQL 会导致正确保存日期吗?而将 C# 日期时间对象直接传递到 PostgreSQL(通过 dapper 和 npgsql)会导致损失一天???

详情如下:

在 PostgreSQL(版本 14)中,我有一列定义为:

ALTER TABLE IF EXISTS phoenix.returntooffice
    ADD COLUMN rtoon date;

在使用 dapper 的 C# 脚本中:

 var q = connection.QuerySingle<ReturnToOfficeOrder>(sql, new
            {
                Rtoon = r.rtoon?.ToString()    //This works correctly with   @Rtoon::date                                
            });

where sql is:

with _in ( rtoon) as (
        values ( @Rtoon::date)
),.......

上面的代码可以正确保存正确的日期时间到postgre;但是,如果我使用:

Rtoon = r.rtoon

r.rtoon 是 C# 日期时间吗? ojbect,postgresql 将 @Rtoon::date 视为 rtoon 的前一天。

我已经研究了有关 UTC、postgre 和 npgsql 的所有文档——但最终我比以往任何时候都更加困惑。

非常感谢任何帮助。

postgresql datetime dapper utc npgsql
1个回答
0
投票

此问题通常与时区转换有关。如果您当地的时区比 UTC 晚,这可能会将日期向后移一天。

建议:

  1. 在将

    'DateTime'
    对象发送到数据库之前将其转换为 UTC 来显式处理时区。

  2. 使用

    DateTimeOffset
    类型,以便时区在日期和时间的背景下更加清晰。

  3. 使用

    'DateTimeKind.Unspecified'
    调整 npgsql 处理
    'NpgsqlConnectionStringBuilder'
    的方式,以确保行为一致。

© www.soinside.com 2019 - 2024. All rights reserved.