有人可以解释一下为什么在通过 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 的所有文档——但最终我比以往任何时候都更加困惑。
非常感谢任何帮助。
此问题通常与时区转换有关。如果您当地的时区比 UTC 晚,这可能会将日期向后移一天。
建议:
在将
'DateTime'
对象发送到数据库之前将其转换为 UTC 来显式处理时区。
使用
DateTimeOffset
类型,以便时区在日期和时间的背景下更加清晰。
使用
'DateTimeKind.Unspecified'
调整 npgsql 处理 'NpgsqlConnectionStringBuilder'
的方式,以确保行为一致。