PostgreSQL pg_backup_start_time() CST 时区转换 问题

PostgreSQL的物理备份方法之一 :
在使用pg_start_backup()函数新建备份点后,用户可以开始拷贝PG的数据文件。

postgres=# select pg_start_backup('a'),now();
 pg_start_backup |              now
-----------------+-------------------------------
 0/50000028      | 2016-05-06 11:03:30.917509+08
(1 row)

调用pg_start_backup后,会创建一个检查点,同时在$PGDATA中新建一个backup_label文件。
里面包含了START TIME的信息,是创建完检查点后的时间。

START WAL LOCATION: 0/50000028 (file 000000010000000000000014)
CHECKPOINT LOCATION: 0/50000028
BACKUP METHOD: pg_start_backup
BACKUP FROM: master
START TIME: 2016-05-06 11:03:33 CST
LABEL: a

但是,使用pg_backup_start_time得到的时间与之不符。

postgres=# select pg_backup_start_time();
  pg_backup_start_time
------------------------
 2016-05-07 01:03:33+08
(1 row)

原因分析,首先我们要看看pg_backup_start_time的代码

postgres=# \df+ pg_backup_start_time
                                                                                         List of functions
   Schema   |         Name         |     Result data type     | Argument data types |  Type  | Security | Volatility |  Owner   | Language |     Source code      |          Description
------------+----------------------+--------------------------+---------------------+--------+----------+------------+----------+----------+----------------------+--------------------------------
 pg_catalog | pg_backup_start_time | timestamp with time zone |                     | normal | invoker  | stable     | postgres | internal | pg_backup_start_time | start time of an online backup
(1 row)

代码如下

/*
 * Returns start time of an online exclusive backup.
 *
 * When there's no exclusive backup in progress, the function
 * returns NULL.
 */
Datum
pg_backup_start_time(PG_FUNCTION_ARGS)
{
        Datum           xtime;
        FILE       *lfp;
        char            fline[MAXPGPATH];
        char            backup_start_time[30];

        /*
         * See if label file is present
         */
        lfp = AllocateFile(BACKUP_LABEL_FILE, "r");
        if (lfp == NULL)
        {
                if (errno != ENOENT)
                        ereport(ERROR,
                                        (errcode_for_file_access(),
                                         errmsg("could not read file \"%s\": %m",
                                                        BACKUP_LABEL_FILE)));
                PG_RETURN_NULL();
        }

        /*
         * Parse the file to find the START TIME line.
         */
        backup_start_time[0] = '\0';
        while (fgets(fline, sizeof(fline), lfp) != NULL)
        {
                if (sscanf(fline, "START TIME: %25[^\n]\n", backup_start_time) == 1)
                        break;
        }

        / Check for a read error. /
        if (ferror(lfp))
                ereport(ERROR,
                                (errcode_for_file_access(),
                           errmsg("could not read file \"%s\": %m", BACKUP_LABEL_FILE)));

        / Close the backup label file. /
        if (FreeFile(lfp))
                ereport(ERROR,
                                (errcode_for_file_access(),
                          errmsg("could not close file \"%s\": %m", BACKUP_LABEL_FILE)));

        if (strlen(backup_start_time) == 0)
                ereport(ERROR,
                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
                                 errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE)));

        /*
         * Convert the time string read from file to TimestampTz form.
         */
        xtime = DirectFunctionCall3(timestamptz_in,
                                                                CStringGetDatum(backup_start_time),
                                                                ObjectIdGetDatum(InvalidOid),
                                                                Int32GetDatum(-1));

        PG_RETURN_DATUM(xtime);
}

所以从代码可以看到pg_backup_start_time是从backup_label中获取到启动时间,并转化为带时区的时间的。

CST时间,CST同时可以代表如下 4 个不同的时区:

Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00

所以问题其实是出在时区转化这里:

postgres=# show timezone;
 TimeZone
----------
 PRC
(1 row)

postgres=# select timestamp '2016-05-06 11:03:33 CST';
      timestamp
---------------------
 2016-05-06 11:03:33
(1 row)

postgres=# select timestamptz '2016-05-06 11:03:33 CST';
      timestamptz
------------------------
 2016-05-07 01:03:33+08
(1 row)

PostgreSQL pg_backup_start_time应该是把CST用USA时区来处理的

postgres=# set timezone='-6';
SET
postgres=# select pg_backup_start_time();
  pg_backup_start_time
------------------------
 2016-05-06 11:03:33-06
(1 row)
时间: 2024-10-03 09:26:42

PostgreSQL pg_backup_start_time() CST 时区转换 问题的相关文章

php时区转换函数

 godaddy主机在国外.把站点建站国外,显示时间时可能需要时区转换,下面是个方便的工具函数,用于时区转换 代码如下: /*  * 时区转换  */   function toTimeZone($src, $from_tz = 'America/Denver', $to_tz = 'Asia/Shanghai', $fm = 'Y-m-d H:i:s') {     $datetime = new DateTime($src, new DateTimeZone($from_tz));    

tomcat-请问如何在weblogic环境下JS怎么将CST时间转换成UTC时间,有遇到过的朋友没?

问题描述 请问如何在weblogic环境下JS怎么将CST时间转换成UTC时间,有遇到过的朋友没? 我现在在本地tomcat环境下可以是将CST时间转换成UTC时间,如: var cstDate=CSTDate;(这是一个变量值,其中值为:Sun Mar 31 00:00:00 CST 2013,但这个地方不知道是String型还是Date型,感觉比较困惑) var date=new Date(cstDate);这样在tomcat下是可以转换的,显示结果为:Sun Mar 31 14:00:00

php时区转换转换函数_php技巧

复制代码 代码如下: /* * 时区转换 */ function toTimeZone($src, $from_tz = 'America/Denver', $to_tz = 'Asia/Shanghai', $fm = 'Y-m-d H:i:s') {    $datetime = new DateTime($src, new DateTimeZone($from_tz));    $datetime->setTimezone(new DateTimeZone($to_tz));    ret

asp.net C#时区转换二个实例

asp教程.net c#时区转换二个实例 对于处理日期和时间的任何应用程序而言,正确处理不同时区之间的差异愈发重要. 应用程序不能再假定所有时间都可以表示为本地时间(datetime 结构中的时间). 例如,显示美国东部当前时间的网页对于东亚地区的客户来说便缺乏可信度. 本主题将说明如何在不同时区之间转换时间,以及如何转换可提供有限时区识别能力的 datetimeoffset 值.   static void main(string[] args)         {             /

ORACLE 时间 时区转换问题 急 急 急 怎么获取Europe/Athens时区的SYSDATE

问题描述 怎么获取Europe/Athens时区的SYSDATE 解决方案 The current Europe/Athens time zone offset is:UTC/GMT +3 hou或者这样select from_tz(to_timestamp('20091101','YYYYMMDD'), 'Europe/Athens') from dual;解决方案二:select from_tz(to_timestamp(sysdate), 'Europe/Athens') from dua

如何使用PHP和PEAR进行不同时区的转换

    PHP具备一系列日期和时间函数,这为您获取时间信息提供了便利,您可以将这些信息转换为需要的格式并用于计算或者展示给用户.但是如果您想实现一些复杂的功能,事情可能会变得非常复杂.     一个简单的例子是在网页上显示时间.在PHP中,您可以简单地使用data()函数读取服务器的时钟并以指定的格式进行显示:但是如果您所要显示的时间是不同时区的,比如,您的公司和服务器位于不同的国家,您需要看到的是本地时间而不是当地时间.     因此,您需要计算出两地的时差,并进行一些计算从而在不同的时区中进

PostgreSQL全角、半角互相转换

标签 PostgreSQL , 全角 , 半角 , 转换 , ascii , chr , 编码 背景 转载原文 http://blog.qdac.cc/?p=1289 我们知道,客户许多时候录入数据时,并不注意输入法是否是全角模式,然后就造成输入的内容,有的是全角有的是半角,造成我们做分析统计时的不便,为此,编写相应的函数.当然这个过程应尽量在前台完成,但如果针对已经存在的数据,下面提供的两个函数就比较方便了. 1.全角转换为半角函数 -- 2014,swish,原版首发:http://blog

Python用模块pytz来转换时区_python

前言 最近遇到了一个问题:我的server和client不是在一个时区,server时区是EDT,即美国东部时区,client,就是我自己的电脑,时区是中国标准时区,东八区.处于测试需要,我需要向server发送一个时间,使得server在这个时间戳去执行一些动作.这个时间戳通常是当前时间加2分钟或者几分钟. 通常美东在夏令时时,和我们相差12小时,所以直接减掉这12小时,然后再加两分钟,可以实现发送基于server的时间戳,但是只有一半时间是夏令时,所以考虑还是基于时区来做.百度了一下,Pyt

一天学会PostgreSQL应用开发与管理 - 7 函数、存储过程和触发器

本章大纲 一.运算符与函数 1 逻辑运算 2 比较运算 3 算数 4 字符串 5 bytea 6 bit 7 规则表达式 8 日期.数字.字符串格式化输出 9 时间 10 枚举 11 几何 12 网络地址 13 全文检索 14 XML 15 JSON.JSONB 16 序列 17 条件表达式 18 数组 19 范围 20 聚合 21 窗口 22 子查询表达式 23 行与数组表达式 24 返回集合的函数 25 系统信息函数 26 系统管理函数 二.过程语言 1 语法 2 plpgsql函数内部结构