Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
Sql 获取给定时间戳和TZ名称的TZ abbrev_Sql_Postgresql_Datetime_Timezone - Fatal编程技术网

Sql 获取给定时间戳和TZ名称的TZ abbrev

Sql 获取给定时间戳和TZ名称的TZ abbrev,sql,postgresql,datetime,timezone,Sql,Postgresql,Datetime,Timezone,转换类型为timestamptz的列后,是否可能获得正确的TZ缩写 例如,我所追求的是展示 “美国/太平洋”时区中的“2016-06-16 16:00:00-04”,目标为TZ abbrev。 我可以很容易地得到: 06/16/2016 01:00 pm 但我无法获得以下信息: 06/16/2016 01:00 pm PDT 一旦转换,timestamp-TZ就变成了timestamp-without-timezone并且变成了_-char说明符“TZ”就变得毫无意义了 下面是我尝试过的一个

转换类型为
timestamptz
的列后,是否可能获得正确的TZ缩写

例如,我所追求的是展示 “美国/太平洋”时区中的“2016-06-16 16:00:00-04”,目标为TZ abbrev。 我可以很容易地得到:

06/16/2016 01:00 pm
但我无法获得以下信息:

06/16/2016 01:00 pm PDT
一旦转换,
timestamp-TZ
就变成了
timestamp-without-timezone
并且
变成了_-char
说明符“TZ”就变得毫无意义了

下面是我尝试过的一个例子:

SELECT
    scheduled_dt                                                                           AS scheduled_dt
  , to_char(scheduled_dt, 'TZ')                                                            AS scheduled_dt_orig_tz  
  -- correct value, but missing TZ  
  , timezone('US/Pacific', scheduled_dt)                                                   AS schedules_dt_converted_tz
  , to_char(timezone('US/Pacific', scheduled_dt), 'MM/DD/YYYY HH:MI pm')                   AS scheduled_dt_converted_tz_localized
   -- after conversion TZ is lost
  , to_char(timezone('US/Pacific', scheduled_dt), 'MM/DD/YYYY HH:MI pm TZ')                AS scheduled_dt_converted_tz_localized_missing_tz
  -- with cast, wrong TZ is displayed 
  , to_char(timezone('US/Pacific', scheduled_dt)::timestamptz, 'MM/DD/YYYY HH:MI pm TZ')   AS scheduled_dt_converted_tz_localized_wrong_tz
FROM orders
LIMIT 5  
和样本输出:

"scheduled_dt","scheduled_dt_orig_tz","schedules_dt_converted_tz","scheduled_dt_converted_tz_localized","scheduled_dt_converted_tz_localized_missing_tz","scheduled_dt_converted_tz_localized_wrong_tz"
"2016-06-16 16:00:00-04","EDT","2016-06-16 13:00:00","06/16/2016 01:00 pm","06/16/2016 01:00 pm ","06/16/2016 01:00 pm EDT"
"2014-07-15 08:00:00-04","EDT","2014-07-15 05:00:00","07/15/2014 05:00 am","07/15/2014 05:00 am ","07/15/2014 05:00 am EDT"
"2012-11-27 10:15:00-05","EST","2012-11-27 07:15:00","11/27/2012 07:15 am","11/27/2012 07:15 am ","11/27/2012 07:15 am EST"
"2011-03-02 08:30:00-05","EST","2011-03-02 05:30:00","03/02/2011 05:30 am","03/02/2011 05:30 am ","03/02/2011 05:30 am EST"
"2016-02-12 14:23:09-05","EST","2016-02-12 11:23:09","02/12/2016 11:23 am","02/12/2016 11:23 am ","02/12/2016 11:23 am EST"

不,因为就存储的内容而言,
timestamp
(也称为带时区的时间戳)。。。您提供了一个时间戳和一个时区,在内部它只是存储为UTC值


听起来基本上您应该将目标时区与时间戳一起存储在一个单独的字段中。

您不能从
时间戳或
时间戳中提取时区(名称或缩写),因为它根本不存在。详细说明:

由于使用全名存储目标TZ,因此可以从系统视图
pg\u timezone\u names
(基于内部函数
pg\u timezone\u names()
)中提取相关的时区缩写

但是

显示的信息是根据
current\u TIMESTAMP
的当前值计算的

这意味着,根据当前时间,您在夏季获得PDT,在冬季获得PST,而不是基于您要显示的时间戳

抱歉,这不是您需要的解决方案。

这可能会给您提供如何实现自己的C函数的想法

相关的:


我使用全名存储目标TZ,存储在联接表(仓库位置)中,因此我可以转换每一行。我缺少的是一个“矩.js TZ类库功能”,它可以将时间戳格式化为考虑DST的短TZ名称……因此我可以根据特定的日期和时区获取“PDT”或“PST”……我已经在代码中这样做了,但不知道是否可以在PG中这样做directly@zam6ak当前位置我个人会避免这样做在数据库中,即使可以。我会将它作为时间戳和单独的时区传输到与数据库通信的任何代码,并在那里进行字符串格式化。您在使用丰富的文化信息等进行格式化时往往处于更好的位置。我完全同意。然而,在我的例子中,数据量非常大(500K和更多行)。因此,为了提高速度,我试图避免“转换”步骤(本质上是代码中每个时间戳列都被转换的循环…@zam6ak:好吧,你只能将其传输到数据库中。。。我不希望它在转换时比你的客户端代码快很多(假设你使用的是一个合理的客户端平台),而且我希望数据传输成本无论如何都会超过转换时间。仔细检查,这不是你需要的解决方案,抱歉。您需要一个使用时区名称和时间戳的函数来生成匹配的时区缩写…正确。我必须在代码中这样做……你和乔恩的答案都是正确的,而且都充满了额外的非常有用的信息。既然乔恩先回答了,我希望你不介意我把他的回答记为回答。@zam6ak:当然,接受哪个答案完全取决于你。
SELECT abbrev
FROM   pg_timezone_names
WHERE  name = 'US/Pacific';

abbrev
--------
PDT