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# 如何使用Npgsql从Postgresql检索UTC日期时间_C#_Postgresql_Datetime_Npgsql - Fatal编程技术网

C# 如何使用Npgsql从Postgresql检索UTC日期时间

C# 如何使用Npgsql从Postgresql检索UTC日期时间,c#,postgresql,datetime,npgsql,C#,Postgresql,Datetime,Npgsql,我使用“timestamp with time zone”列类型,并将日期时间设置为: INSERT INTO mytable(col1) VALUES(timestamp with time zone '2020-07-16 17:45:00.000000+00'); 每当我尝试检索日期时间时,它们都会被转换为“本地”类型 这不是我想要的,它设置为UTC日期时间,我希望它返回为UTC,我不希望它转换为本地数据进入数据库,也不希望它返回。。。这样做就不可能在不引起歧义的情况下到达UTC 我已尝

我使用“timestamp with time zone”列类型,并将日期时间设置为:

INSERT INTO mytable(col1)
VALUES(timestamp with time zone '2020-07-16 17:45:00.000000+00');
每当我尝试检索日期时间时,它们都会被转换为“本地”类型

这不是我想要的,它设置为UTC日期时间,我希望它返回为UTC,我不希望它转换为本地数据进入数据库,也不希望它返回。。。这样做就不可能在不引起歧义的情况下到达UTC

我已尝试设置“PGTZ”环境变量;当连接打开时,我还执行了以下sql:

Connection.ExecuteAsync( "SET TIMEZONE TO 'UTC'" );
我尝试过的任何东西似乎都不起作用,而且似乎是根据各种帖子设计的,比如:

这对我来说似乎是完全错误的,但我希望有人能为我指出解决这个问题的方法


我使用的是.net5/asp.net和Dapper(不是EFCore)以及Npgsql版本4.1.5。

Postgresql
timestamptz
实际上并不存储时区,它只存储UTC时的值。这意味着
'2020-07-16 17:45:00.000000+00'
在输入时不会转换为UTC。如果没有指定的时区,它将从
时区设置旋转到
UTC
。在检索时,虽然它将使用
时区
设置旋转回该时区。我怀疑您的设置不是在进行时间戳检索的同一会话中进行的。我会尝试类似于时区“UTC”的
SELECT timestamp\u fld
Postgresql
timestamp TZ
实际上并不存储时区,它只存储UTC时的值。这意味着
'2020-07-16 17:45:00.000000+00'
在输入时不会转换为UTC。如果没有指定的时区,它将从
时区设置旋转到
UTC
。在检索时,虽然它将使用
时区
设置旋转回该时区。我怀疑您的设置不是在进行时间戳检索的同一会话中进行的。我会尝试类似于时区“UTC”的
SELECT timestamp\u fld

这确实是经过设计的,并且在常规文本查询中查询timestamptz值时匹配PostgreSQL。如果使用fire up psql或pgadmin并选择timestamptz列,您将看到基于
时区的本地时间戳


正如@adrian klaver所提到的,timestamptz不是关于在数据库中存储时区的,而是关于在基于
timezone
参数向数据库读取和写入时间戳值时应用时区转换。如果您不希望有任何这样的转换,考虑切换到时间戳(没有时区),并按惯例将所有时间戳作为UTC。

< P>这是设计中的,并且在查询常规文本查询中的TimeStPtz值时,匹配PostgreSQL。如果使用fire up psql或pgadmin并选择timestamptz列,您将看到基于
时区的本地时间戳


正如@adrian klaver所提到的,timestamptz不是关于在数据库中存储时区的,而是关于在基于
timezone
参数向数据库读取和写入时间戳值时应用时区转换。如果你不想要任何这样的转换,考虑切换到时间戳(没有时区),并按惯例将所有时间戳作为UTC。

谢谢@ Shay,我读到,如果你想存储UTC值,你应该使用<代码>时间戳和时区< /代码>,但是我没有考虑到,因为我通过代码控制事物,那么在设置值之前,我可以确保它的UTC。我必须说,在所有dbs中,postgres在这方面似乎过于复杂,容易出错,因此感谢您的澄清。我同意PG有点混乱(尽管FWIW似乎只是非常严格地遵循SQL标准)。您可能希望阅读带有或不带时区的时间戳;我真的推荐使用“UTC按惯例”谢谢@ Shay,我读到,如果你想存储UTC值,你应该使用<代码>时间戳带时区< /代码>,但是我没有考虑到我通过代码控制事情,那么我可以在设置值之前确保它的UTC。我必须说,在所有dbs中,postgres在这方面似乎过于复杂,容易出错,因此感谢您的澄清。我同意PG有点混乱(尽管FWIW似乎只是非常严格地遵循SQL标准)。您可能希望阅读带有或不带时区的时间戳;我真的建议您选择“UTC按惯例”