在 SQL 中从 POSTGRE/SQL 数据库转换 UTC 时间字段

Posted

技术标签:

【中文标题】在 SQL 中从 POSTGRE/SQL 数据库转换 UTC 时间字段【英文标题】:Converting UTC time field from a POSTGRE/SQL database in SQL 【发布时间】:2011-10-27 07:32:12 【问题描述】:

我的数据库有问题。 我从未习惯在 PostgreSQL 中工作,我想从 UTC 日期时间字段中进行选择并获得 GMT 日期时间作为结果。

其实我的要求是:select dateheure from position 做我想做的事的 Postgresql 请求应该是什么???

非常感谢 格温内尔

【问题讨论】:

【参考方案1】:

PostgreSQL 确实有两个datetime types:

timestamp without time zone(默认隐式timestamptimestamp with time zone

我猜你有 UTC 日期时间的表(没有时区类型):

CREATE TEMP TABLE datetimetest
(
    datetime timestamp
);

\d datetimetest
           Table "pg_temp_1.datetimetest"
  Column  |            Type             | Modifiers 
----------+-----------------------------+-----------
 datetime | timestamp without time zone | 

INSERT INTO datetimetest SELECT CURRENT_TIMESTAMP AT TIME ZONE 'UTC';

SELECT datetime FROM datetimetest;
          datetime          
----------------------------
 2011-08-15 15:04:06.507166
(1 row)

要获取某个时区的日期时间,您可以使用 AT TIME ZONE 构造:

SET TIME ZONE 'UTC';
SELECT datetime AT TIME ZONE 'GMT-5' FROM datetimetest;
           timezone            
-------------------------------
 2011-08-15 10:04:06.507166+00
(1 row)

【讨论】:

刚刚尝试过:在 TIME ZONE 'GMT' FROM 位置选择 dateheure; 并得到: ERREUR: la fonction pg_catalog.timezone(unknown, text) n'existe pas LINE 1: SELECT dateheure AT TIME ZONE 'GMT' FROM position; ^ 提示:Aucune 函数对应于 au nom donné et aux types d'arguments。 Vous devez ajouter des conversions explicites de type。 @Gwenael:您的dateheure 列具有text 类型,因此此处无法识别。可能您需要的只是显式转换为时间戳,即:SELECT dateheure::timestamp AT TIME ZONE 'GMT' FROM position;。但是,要存储日期时间,您可能应该使用两种时间戳类型之一。【参考方案2】:

In a different post 我使用CHECK() 约束来确保您只从数据库中存储和接收UTC。希望对您有所帮助。

【讨论】:

以上是关于在 SQL 中从 POSTGRE/SQL 数据库转换 UTC 时间字段的主要内容,如果未能解决你的问题,请参考以下文章

sql 忽略Postgre SQL中的重复插入

sql Criarusuário只读没有Postgre SQL

福利MySQL vs Postgre SQL: 5个你最关注的非技术维度的区别

《Postgre SQL 即学即用 (第三版)》 分享 pdf下载

在 SQL Server 中从完整路径提取文件名(sql 玩转文件路径)

在 Python 中从 SQL 读取转换数据类型