GaussDB-GaussDB-时间和日期处理函数和操作符(上)

287 阅读1小时+

GaussDB-GaussDB-时间和日期处理函数和操作符

时间日期操作符

时间日期操作符如表1所示。

用户在使用时间和日期操作符时,对应的操作数请使用明确的类型前缀修饰,以确保数据库在解析操作数的时候能够与用户预期一致,不会产生用户非预期的结果。

比如下面示例没有明确数据类型就会出现异常错误。

| ``` gaussdb=# SELECT date '2001-10-01' - '7' AS RESULT; ERROR: GAUSS-10416: invalid input syntax for type timestamp: "7" SQLSTATE: 22007 LINE 1: SELECT date '2001-10-01' - '7' AS RESULT; ^ CONTEXT: referenced column: result

| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

[]()[]()

| 操作符                                                                                                                                                                                                                                                                                                                                       | 示例                                                                                                                                                                                                                                                                                                               |
| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| +                                                                                                                                                                                                                                                                                                                                        | | ```
gaussdb=# SELECT date '2001-9-28' + integer '7' AS RESULT;    result ------------  2001-10-05 (1 row) 
``` |
| -------------------------------------------------------------------------------------------------------------- |说明:-   在MYSQL兼容模式下,查询结果为2001-10-05。
-   在ORA兼容模式下,查询结果为2001-10-05 00:00:00。 |
| | ```
gaussdb=# SELECT date '2001-09-28' + interval '1 hour' AS RESULT;        result         ---------------------  2001-09-28 01:00:00 (1 row) 
``` |
| --------------------------------------------------------------------------------------------------------------------------------------------------- |                           |                                                                                                                                                                                                                                                                                                                  |
| | ```
gaussdb=# SELECT date '2001-09-28' + time '03:00' AS RESULT;        result         ---------------------  2001-09-28 03:00:00 (1 row) 
``` |
| ---------------------------------------------------------------------------------------------------------------------------------------------- |                                     |                                                                                                                                                                                                                                                                                                                  |
| | ```
gaussdb=# SELECT interval '1 day' + interval '1 hour' AS RESULT;      result      ----------------  1 day 01:00:00 (1 row) 
``` |
| ----------------------------------------------------------------------------------------------------------------------------------- |                                                           |                                                                                                                                                                                                                                                                                                                  |
| | ```
gaussdb=# SELECT timestamp '2001-09-28 01:00' + interval '23 hours' AS RESULT;        result         ---------------------  2001-09-29 00:00:00 (1 row) 
``` |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | |                                                                                                                                                                                                                                                                                                                  |
| | ```
gaussdb=# SELECT time '01:00' + interval '3 hours' AS RESULT;   result   ----------  04:00:00 (1 row) 
``` |
| -------------------------------------------------------------------------------------------------------------- |                                                                                                     |                                                                                                                                                                                                                                                                                                                  |
| -                                                                                                                                                                                                                                                                                                                                        | | ```
gaussdb=# SELECT date '2001-10-01' - date '2001-09-28' AS RESULT;  result --------       3 (1 row) 
``` |
| ----------------------------------------------------------------------------------------------------------- |                                                                                  |
| | ```
gaussdb=# SELECT date '2001-10-01' - integer '7' AS RESULT;        result         ---------------------  2001-09-24 00:00:00 (1 row) 
``` |
| --------------------------------------------------------------------------------------------------------------------------------------------- |                                       |                                                                                                                                                                                                                                                                                                                  |
| | ```
gaussdb=# SELECT date '2001-09-28' - interval '1 hour' AS RESULT;        result         ---------------------  2001-09-27 23:00:00 (1 row) 
``` |
| --------------------------------------------------------------------------------------------------------------------------------------------------- |                           |                                                                                                                                                                                                                                                                                                                  |
| | ```
gaussdb=# SELECT time '05:00' - time '03:00' AS RESULT;   result   ----------  02:00:00 (1 row) 
``` |
| -------------------------------------------------------------------------------------------------------- |                                                                                                                 |                                                                                                                                                                                                                                                                                                                  |
| | ```
gaussdb=# SELECT time '05:00' - interval '2 hours' AS RESULT;   result   ----------  03:00:00 (1 row) 
``` |
| -------------------------------------------------------------------------------------------------------------- |                                                                                                     |                                                                                                                                                                                                                                                                                                                  |
| | ```
gaussdb=# SELECT timestamp '2001-09-28 23:00' - interval '23 hours' AS RESULT;        result         ---------------------  2001-09-28 00:00:00 (1 row) 
``` |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | |                                                                                                                                                                                                                                                                                                                  |
| | ```
gaussdb=# SELECT interval '1 day' - interval '1 hour' AS RESULT;   result   ----------  23:00:00 (1 row) 
``` |
| ----------------------------------------------------------------------------------------------------------------- |                                                                                               |                                                                                                                                                                                                                                                                                                                  |
| | ```
gaussdb=# SELECT timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' AS RESULT;      result      ----------------  1 day 15:00:00 (1 row) 
``` |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------- |             |                                                                                                                                                                                                                                                                                                                  |
| *                                                                                                                                                                                                                                                                                                                                        | | ```
gaussdb=# SELECT 900 * interval '1 second' AS RESULT;   result   ----------  00:15:00 (1 row) 
``` |
| ------------------------------------------------------------------------------------------------------ |                                                                                            |
| | ```
gaussdb=# SELECT 21 * interval '1 day' AS RESULT;  result   ---------  21 days (1 row) 
``` |
| ----------------------------------------------------------------------------------------------- |                                                                                                                                   |                                                                                                                                                                                                                                                                                                                  |
| | ```
gaussdb=# SELECT double precision '3.5' * interval '1 hour' AS RESULT;   result   ----------  03:30:00 (1 row) 
``` |
| ----------------------------------------------------------------------------------------------------------------------- |                                                                                   |                                                                                                                                                                                                                                                                                                                  |
| /                                                                                                                                                                                                                                                                                                                                         | | ```
gaussdb=# SELECT interval '1 hour' / double precision '1.5' AS RESULT;   result   ----------  00:40:00 (1 row) 
``` |
| ----------------------------------------------------------------------------------------------------------------------- |                                                          |

#### 时间/日期函数

-   age(timestamp, timestamp)

    []()[]()描述:将两个参数相减,并以年、月、日作为返回值。若相减值为负,则函数返回亦为负,入参可以都带timezone或都不带timezone。

    返回值类型:interval

    示例:

    | ```
    gaussdb=# SELECT age(timestamp '2001-04-10', timestamp '1957-06-13');            age            -------------------------  43 years 9 mons 27 days (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   age(timestamp)

    []()[]()描述:当前SQL执行开始时刻的系统时间和参数相减,入参可以带或者不带timezone。

    返回值类型:interval

    示例:

    | ```
    gaussdb=# SELECT age(timestamp '1957-06-13');            age            -------------------------  60 years 2 mons 18 days (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------- |

-   clock_timestamp()

    []()[]()描述:返回当前函数被调用时的系统时间的时间戳。volatile函数,每次扫描都会取最新的时间戳,因此在一次查询中每次调用结果不相同。

    返回值类型:timestamp with time zone

    示例:

    | ```
    gaussdb=# SELECT clock_timestamp();         clock_timestamp         -------------------------------  2017-09-01 16:57:36.636205+08 (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------- |

-   current_date

    []()[]()描述:返回当前本条SQL启动的系统时间的日期。

    返回值类型:date

    示例:

    | ```
    gaussdb=# SELECT current_date;     date     ------------  2017-09-01 (1 row) -- ORA兼容模式下,打开GUC参数a_format_date_timestamp时 gaussdb=# SET a_format_date_timestamp=on; SET gaussdb=# SELECT current_date;     current_date      ---------------------  2023-11-24 11:25:09 (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/47b30b590ecc472eb03d3d32310290d6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=Mf3phWLV8r7msNpKymcBdddnu80%3D)

    -   该函数在sql_compatibility = 'ORA',且GUC参数a_format_date_timestamp值为on的情况下有如下行为:

        -   返回当前本条SQL启动的系统时间的时间戳。
        -   返回值类型为timestamp without time zone,保留到秒,列名为current_date。
        -   参数a_format_version值为10c和a_format_dev_version值为s2的情况下返回值类型为timestamp。
        -   关闭GUC参数a_format_date_timestamp,返回的结果为事务开启的系统时间的日期。

    -   该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有如下行为:

        -   current_date支持带括号调用。
        -   current_date实际调用的函数为curdate,可以用“\df curdate”指令查询函数详细入参和返回值。

-   current_time()

    []()[]()描述:当前事务的开始时刻的系统时间。在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时,返回当前本条SQL执行开始时刻的系统时间。

    返回值类型:time with time zone,在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时,类型是time without time zone。

    示例:

    | ```
    gaussdb=# SELECT current_time;        timetz        --------------------  16:58:07.086215+08 (1 row) --MYSQL模式下打开参数时 gaussdb_m=# SELECT current_time;  current_time  --------------  15:14:00 (1 row) 
    ``` |
    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   current_time([precision])

    []()[]()描述:返回当前本条SQL执行开始时刻的系统时间。

    参数:表示精度(秒后小数位数),int类型,范围为[0,6],缺省时默认值为0,无效精度值都报错。

    返回值类型:time without time zone

    实现方式:映射成系统函数curtime。

    示例:

    ```
    gaussdb_m=# SELECT current_time();
     current_time 
    --------------
     15:14:05
    (1 row)
    gaussdb_m=# SELECT current_time(3);
     current_time 
    --------------
     15:14:08.433
    (1 row)
    ```

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/fa33772b630d4a6c8f273b33f19e5ec6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=3Xex3YlG73z1cUlDmgjc%2Bm37AQE%3D)

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。curent_time实际调用的函数为curtime,可以用“\df curtime”指令查询函数详细入参和返回值。

-   current_timestamp

    []()[]()描述:当前日期及时间。语句级别时间,同一个语句内返回结果不变。

    返回值类型:MYSQL模式库中的5.7版本下(sql_compatibility = 'MYSQL'、b_format_version='5.7'、b_format_dev_version='s1')返回类型为timestamp without time zone,其他场景下返回类型为timestamp with time zone。

    示例:

    | ```
    gaussdb=# SELECT current_timestamp;        pg_systimestamp         ------------------------------  2017-09-01 16:58:19.22173+08 (1 row)  -- MYSQL模式库中的5.7版本下 gaussdb_m=# SELECT current_timestamp;       timestamp ---------------------  2023-08-21 15:08:24 (1 row) -- ORA模式下,打开GUC参数a_format_date_timestamp时 gaussdb=# SET a_format_date_timestamp=on; SET gaussdb=# SELECT current_timestamp;        current_timestamp        -------------------------------  2023-11-24 11:31:04.895312+08 (1 row) 
    ``` |
    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/2a8b73b598514458934d8b0fa0457256~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=YFXodkDyyk01gDHF7zTrrrlJQkw%3D)

    该函数在sql_compatibility = 'ORA'且GUC参数a_format_date_timestamp值为on的情况下有如下行为:

    -   返回的结果为当前本条SQL启动的系统时间的时间戳。
    -   返回值类型为timestamp with time zone,列名为current_timestamp。
    -   关闭GUC参数a_format_date_timestamp,返回结果为系统时间。

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有如下行为:

    -   返回类型为timestamp without time zone。
    -   返回结果的精度为0。
    -   返回的结果为当前本条sql启动的系统时间的时间戳。
    -   该函数通过TYPE转化实现,无实际注册函数,因此通过gsql工具的\df+等相关命令查看的为其他兼容模式下的函数信息,而不是MYSQL兼容模式5.7版本中的函数信息。

-   current_timestamp()

    []()[]()描述:返回的结果为当前SQL启动的系统时间。

    返回值类型:timestamp without time zone

    示例:

    | ```
    gaussdb=# SELECT current_timestamp();       timestamp ---------------------  2023-08-21 14:34:30 (1 row) 
    ``` |
    | ----------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7a531386e7a34d21ab68e957e94aedd8~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=0y1z%2Fh6anwyrO%2BRVW1V09sYc14s%3D)

    该函数仅支持在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时使用,且有如下行为:

    -   返回类型为timestamp without time zone。
    -   返回结果的精度为0。
    -   返回的结果为当前本条SQL启动的系统时间的时间戳。
    -   该函数通过TYPE转化实现,无实际注册函数,因此通过gsql工具的\df+等相关命令查看的为其他模式下的函数信息,而不是MYSQL兼容模式的5.7版本中的函数信息。

-   current_timestamp(precision)

    []()[]()描述:当前日期及时间,并将结果的微秒圆整为指定小数位。

    参数:表示精度(秒后小数位数),int类型,范围为[0,6],缺省时默认值为0,超过6的整型值告警,并取最大值6输出带精度时间值,其他无效值都报错。

    返回值类型:MYSQL模式库中的5.7版本下(sql_compatibility = 'MYSQL'、b_format_version='5.7'、b_format_dev_version='s1')返回类型为timestamp without time zone,其他场景下返回类型为timestamp with time zone。

    示例:

    | ```
    gaussdb=# SELECT current_timestamp(1);        timestamptz             ------------------------------  2017-09-01 16:58:19.2+08 (1 row)  -- MYSQL模式库中的5.7版本下 gaussdb_m=# SELECT current_timestamp(1);        timestamp -----------------------  2023-08-21 15:09:35.3 (1 row)  -- ORA模式下打开GUC参数a_format_date_timestamp时 gaussdb=# SET a_format_date_timestamp=on; SET gaussdb=# SELECT current_timestamp(6);        current_timestamp        -------------------------------  2023-11-24 11:35:57.268592+08 (1 row) -- 在ORA兼容模式数据库中且参数a_format_version值为10c、a_format_dev_version值为s2的情况下,precision参数支持numeric类型的整值 gaussdb=# SET a_format_version='10c'; SET gaussdb=# SET a_format_dev_version='s2'; SET gaussdb=# SELECT current_timestamp(6.0);       current_timestamp        ------------------------------  2023-11-25 11:14:48.74763+08 (1 row) 
    ``` |
    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/f99f0620c1004dd2b35cd31961e66b0a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=cMBrwLa9%2FXzAo33sxzi22AtpQyM%3D)

    -   微秒末位的0不显示,如2017-09-01 10:32:19.212000输出显示为2017-09-01 10:32:19.212。

    -   该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有如下行为:

        -   返回类型为timestamp without time zone。
        -   返回的结果为当前本条SQL启动的系统时间的时间戳。
        -   该函数通过TYPE转化实现,无实际注册函数,因此通过gsql工具的\df+等相关命令查看的为其他模式下的函数信息,而不是MYSQL兼容模式的5.7版本中的函数信息。

    -   该函数在sql_compatibility = 'ORA',且GUC参数a_format_date_timestamp值为on的情况下有如下行为:

        -   返回值类型为timestamp with time zone,列名为current_timestamp。
        -   返回的结果为当前本条SQL启动的系统时间的时间戳。
        -   当参数a_format_version值为10c、a_format_dev_version值为s2时,precision参数支持numeric类型的整值,否则仅支持int输入。
        -   关闭GUC参数a_format_date_timestamp,当入参为不带小数点的整值时,返回的结果为事务开启的系统的日期和时间;当入参为带小数点的整值时,返回结果为系统时间。

-   pg_systimestamp()

    []()[]()描述:当前日期和时间(当前语句的开始)。

    返回值类型:timestamp with time zone

    示例:

    | ```
    gaussdb=# SELECT pg_systimestamp();         pg_systimestamp -------------------------------  2015-10-14 11:21:28.317367+08 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------- |

-   date_part(text, timestamp)

    []()[]()描述:

    获取日期或者时间值中子域的值,例如年或者小时的值。

    等效于extract(field from timestamp)。

    timestamp类型:abstime、date、interval、reltime、time with time zone、time without time zone、timestamp with time zone、timestamp without time zone。

    返回值类型:double precision

    示例:

    | ```
    gaussdb=# SELECT date_part('hour', timestamp '2001-02-16 20:38:40');  date_part  -----------         20 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------ |

-   date_part(text, interval)

    []()[]()描述:获取月份的值。如果大于12,则取与12的模。等效于extract(field from timestamp)。

    返回值类型:double precision

    示例:

    | ```
    gaussdb=# SELECT date_part('month', interval '2 years 3 months');  date_part  -----------          3 (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------- |

-   date_trunc(text, timestamp)

    []()[]()描述:截取到参数text指定的精度。

    返回值类型:interval、timestamp with time zone、timestamp without time zone

    示例:

    | ```
    gaussdb=# SELECT date_trunc('hour', timestamp  '2001-02-16 20:38:40');      date_trunc       ---------------------  2001-02-16 20:00:00 (1 row) 
    ``` |
    | -------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   trunc(timestamp)

    []()[]()描述:默认按天截取。

    示例:

    | ```
    gaussdb=# SELECT trunc(timestamp  '2001-02-16 20:38:40');                                                                                                                                                                   trunc --------------------- 2001-02-16 00:00:00 (1 row) 
    ``` |
    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   trunc(arg1, arg2)

    []()[]()描述:截取到arg2指定的精度。

    -   arg1类型:interval、timestamp with time zone、timestamp without time zone
    -   arg2类型:text

    返回值类型:interval、timestamp with time zone、timestamp without time zone

    示例:

    | ```
    gaussdb=# SELECT trunc(timestamp  '2001-02-16 20:38:40', 'hour');                                                                                                                                                                   trunc --------------------- 2001-02-16 20:00:00 (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   round(arg1, arg2)

    []()[]()描述:四舍五入到arg2指定的精度。

    arg1类型:timestamp without time zone

    arg2类型:text

    返回值类型:timestamp without time zone

    示例:

    | ```
    gaussdb=# SELECT round(timestamp  '2001-02-16 20:38:40', 'hour');                                                                                                                                                                   round --------------------- 2001-02-16 21:00:00 (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/786375e67c954f14b401f93ca64685e9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=cp6nGT05BKquyIgR0oecG%2FrtxMA%3D)

    此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下有效。

-   daterange(arg1, arg2)

    []()[]()描述:获取时间边界信息。

    arg1类型:date

    arg2类型:date

    返回值类型:daterange

    示例:

    | ```
    gaussdb=# SELECT daterange('2000-05-06','2000-08-08');         daterange         -------------------------  [2000-05-06,2000-08-08) (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------------------------------------------------------------------- |

-   daterange(arg1, arg2, text)

    []()[]()描述:获取时间边界信息。

    arg1类型:date

    arg2类型:date

    text类型:text

    返回值类型:daterange

    示例:

    | ```
    gaussdb=# SELECT daterange('2000-05-06','2000-08-08','[]');         daterange         -------------------------  [2000-05-06,2000-08-09) (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   isfinite(date)

    []()[]()描述:判断日期是否为有限值,是则返回t,否则返回f。

    返回值类型:Boolean

    示例:

    | ```
    gaussdb=# SELECT isfinite(date '2001-02-16');  isfinite  ----------  t (1 row) gaussdb=# SELECT isfinite(date 'infinity');  isfinite  ----------  f (1 row) 
    ``` |
    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   isfinite(timestamp)

    []()[]()描述:判断时间戳是否为有限值,是则返回t,否则返回f。

    返回值类型:Boolean

    示例:

    | ```
    gaussdb=# SELECT isfinite(timestamp '2001-02-16 21:28:30');  isfinite  ----------  t (1 row) gaussdb=# SELECT isfinite(timestamp 'infinity');  isfinite  ----------  f (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   isfinite(interval)

    []()[]()描述:判断时间间隔是否为有限值,是则返回t,暂不支持返回f,输入'infinity'会报错。

    返回值类型:Boolean

    示例:

    | ```
    gaussdb=# SELECT isfinite(interval '4 hours');  isfinite  ----------  t (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------- |

-   justify_days(interval)

    []()[]()描述:将时间间隔以月(30天为一月)为单位。

    返回值类型:interval

    示例:

    | ```
    gaussdb=# SELECT justify_days(interval '35 days');  justify_days  --------------  1 mon 5 days (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------- |

-   justify_hours(interval)

    []()[]()描述:将时间间隔以天(24小时为一天)为单位。

    返回值类型:interval

    示例:

    | ```
    gaussdb=# SELECT JUSTIFY_HOURS(INTERVAL '27 HOURS');  justify_hours   ----------------  1 day 03:00:00 (1 row) 
    ``` |
    | ----------------------------------------------------------------------------------------------------------------------- |

-   justify_interval(interval)

    []()[]()描述:结合justify_days和justify_hours,调整interval。

    返回值类型:interval

    示例:

    | ```
    gaussdb=# SELECT JUSTIFY_INTERVAL(INTERVAL '1 MON -1 HOUR');  justify_interval  ------------------  29 days 23:00:00 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------- |

-   localtime()

    []()[]()描述:当前事务的开始时刻的系统时间。在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时返回当前本条SQL执行开始时刻的系统日期和时间。

    返回值类型:time,在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时返回类型timestamp without time zone。

    示例:

    | ```
    gaussdb=# SELECT localtime AS RESULT;      result ----------------  16:05:55.664681 (1 row) -- MYSQL模式,打开兼容性参数后 gaussdb_m=# select localtime;       localtime       ---------------------  2023-08-21 15:21:57 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   localtime[([precision])]

    []()[]()描述:返回当前本条SQL执行开始时刻的系统日期和时间。

    参数:表示精度(秒后小数位数),int类型,范围为[0,6],缺省时默认值为0,无效值都报错。

    返回值类型:timestamp without time zone

    实现方式:注册系统函数localtime。

    示例:

    | ```
    gaussdb_m=# SELECT localtime();       localtime       ---------------------  2023-08-21 15:23:49 (1 row) gaussdb_m=# SELECT localtime(3);         localtime         -------------------------  2023-08-21 15:23:51.965 (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/f6630488ab5b4419b4137106c3d99d32~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=Wf5Ok%2BK6R%2BDEqRALBEUAtTtJlzg%3D)

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

-   localtimestamp

    []()[]()描述:当前日期及时间。

    返回值类型:timestamp

    示例:

    | ```
    gaussdb=# SELECT localtimestamp;          timestamp           ----------------------------  2017-09-01 17:03:30.781902 (1 row) -- MYSQL兼容模式下,打开兼容性参数 gaussdb_m=# SELECT localtimestamp;       timestamp       ---------------------  2023-08-21 15:27:55 (1 row) -- ORA兼容模式下打开GUC参数a_format_date_timestamp时 gaussdb=# SET a_format_date_timestamp=on; SET gaussdb=# SELECT localtimestamp;        localtimestamp        ----------------------------  2023-11-24 11:38:25.633231 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/21b228e6796a42908b39bd83a3905882~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=cJ0YipNOSJPYbgqQUUBWEyY3YcA%3D)

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有如下行为:

    -   返回当前本条SQL执行开始时刻的系统日期和时间。
    -   返回类型timestamp without time zone,列名为timestamp

    该函数在sql_compatibility = 'ORA',且GUC参数a_format_date_timestamp值为on的情况下有如下行为:

    -   返回值类型为timestamp without time zone,列名为localtimestamp。
    -   返回的结果为当前本条SQL启动的系统时间的时间戳。
    -   关闭GUC参数a_format_date_timestamp,返回的结果为事务开启的系统的日期和时间。

-   localtimestamp[([precision])]

    []()[]()描述:当前日期及时间。

    参数:表示精度(秒后小数位数),int类型,范围为[0,6],缺省时默认值为0,超过6的整型值告警,并取最大值6输出带精度时间值,其他无效值都报错。

    返回值类型:timestamp without time zone

    示例:

    | ```
    -- 带括号且无入参调用仅在MYSQL兼容模式下支持 gaussdb_m=# SELECT localtimestamp();       timestamp       ---------------------  2023-08-21 15:27:59 (1 row) gaussdb_m=# SELECT localtimestamp(3);         timestamp         -------------------------  2023-08-21 15:28:02.445 (1 row) -- ORA兼容模式下,打开GUC参数a_format_date_timestamp时 gaussdb=# SET a_format_date_timestamp=on; SET gaussdb=# SELECT localtimestamp(6);        localtimestamp        ----------------------------  2023-11-24 11:41:14.086227 (1 row) -- 在ORA兼容模式数据库中且参数a_format_version值为10c、a_format_dev_version值为s2的情况下,precision参数支持numeric类型的整值 gaussdb=# SET a_format_version='10c'; SET gaussdb=# SET a_format_dev_version='s2'; SET gaussdb=# SELECT localtimestamp(6.0);        localtimestamp        ----------------------------  2023-11-24 11:42:45.642167 (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e0b88e6dd99e4c6ab551ea3c1f9f1f15~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=3DN0EuRAoZkaQnxYXczvHJz2RkE%3D)

    -   微秒末位的0不显示,如2017-09-01 10:32:19.212000输出显示为2017-09-01 10:32:19.212。

    -   该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时,返回当前本条SQL执行开始时刻的系统日期和时间,支持带括号且无入参调用。

    -   该函数在sql_compatibility = 'ORA',且GUC参数a_format_date_timestamp值为on的情况下,有以下行为:

        -   返回当前本条SQL启动的系统时间的时间戳。
        -   返回值类型为timestamp without time zone,列名为localtimestamp。
        -   当参数a_format_version值为10c、a_format_dev_version值为s2时,precision参数支持numeric类型的整值,否则仅支持int输入。
        -   关闭GUC参数a_format_date_timestamp,返回的结果为事务开启的系统的日期和时间。

-   maketime(hour, minute, second)

    []()[]()描述:通过入参hour、minute、second生成对应time类型时间,其中三个入参类型分别为bigint、bigint和numeric。

    返回值类型:time

    示例:

    | ```
    gaussdb=# SELECT maketime(8, 15, 26.53);   maketime -------------  08:15:26.53 (1 row)  gaussdb=# SELECT maketime(-888, 15, 26.53);   maketime ------------  -838:59:59 (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/760beb3a6d5848cbaf18f6f9da6bc079~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=eQsJUduH%2B%2Bn70klvsgnOl1EsHdc%3D)

    该函数仅支持sql_compatibility = 'MYSQL',GUC参数b_format_version='5.7'、b_format_dev_version='s1'时使用,且有如下行为:

    -   当参数满足如下任一条件时,函数返回NULL。

        -   入参minute < 0 或 minute >= 60。
        -   入参second < 0 或 second >= 60。
        -   任一参数为NULL。

    -   返回的time类型结果保留6位小数,若second超出六位小数,则按照四舍五入进位。

    -   返回time类型值要求在[-838:59:59, 838:59:59]中。若超出范围,则根据hour的正负来返回指定的边界值。

    -   maketime不支持自嵌套。

-   now()

    []()[]()描述:当前事务的开始时刻的系统的日期及时间,同一个事务内返回结果相同。仅在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时返回当前本条SQL执行开始时刻的系统日期和时间。

    返回值类型:timestamp with time zone,在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时返回类型timestamp without time zone

    示例:

    | ```
    gaussdb=# SELECT now();               now               -------------------------------  2017-09-01 17:03:42.549426+08 (1 row) --MYSQL模式下,打开兼容性参数 gaussdb_m=# SELECT now();       timestamp       ---------------------  2023-08-21 17:17:42 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   now(precision)

    []()[]()描述:返回当前本条SQL执行开始时刻的系统日期和时间。

    参数:表示精度(秒后小数位数),int类型,范围为[0,6],缺省时默认值为0,超过6的整型值告警,并取最大值6输出带精度时间值,其他无效值都报错。

    返回值类型:timestamp without time zone

    实现方式:'now' :: text :: timestamp without time zone表达式获取。

    示例:

    | ```
    gaussdb_m=# SELECT now(3);         timestamp         -------------------------  2023-08-21 17:17:48.819 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------ |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6a7bc0712d2f4e729963d964124591b5~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=y5J6CWgrtfJYGPW1DBYX4xRU%2Bh4%3D)

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

-   timenow()

    []()[]()描述:返回当前本条SQL执行开始时刻的系统日期和时间。

    返回值类型:abstime

    示例:

    | ```
    gaussdb=# SELECT timenow();         timenow ------------------------  2020-06-23 20:36:56+08 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------- |

-   dbtimezone

    []()[]()描述:当前数据库的时区。

    返回值类型:text

    示例:

    | ```
    gaussdb=# SELECT dbtimezone;         dbtimezone ------------------------  PRC (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b00c926cb1634abdb209db1686f43ace~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=sapEGzncG2H%2FMkAGQkGj2WN6Xbw%3D)

    此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下有效。

-   numtodsinterval(num, interval_unit)

    []()[]()描述:将数字转换为interval类型。num为numeric类型数字,interval_unit为固定格式字符串('DAY' | 'HOUR' | 'MINUTE' | 'SECOND')。

    可以通过设置GUC参数IntervalStyle为ORA,兼容该函数interval输出格式。

    返回值类型:interval

    示例:

    | ```
    gaussdb=# SELECT numtodsinterval(100, 'HOUR');  numtodsinterval  -----------------  100:00:00 (1 row)  gaussdb=# SET intervalstyle = oracle; SET gaussdb=# SELECT numtodsinterval(100, 'HOUR');         numtodsinterval -------------------------------  +000000004 04:00:00.000000000 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/64b29c5da389455ca5a176d6c4dc82fe~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=PtS1hetutQjDtxpxR5hX%2BnlAyt0%3D)

    此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下:当参数interval_unit为 'DAY' 时,参数num超过1000000000会报错。

-   numtoyminterval(num, interval_unit)

    []()[]()描述:将数字转换为interval类型。num为numeric类型数字,interval_unit为固定格式字符串('YEAR' | 'MONTH')。

    可以通过设置GUC参数IntervalStyle为ORA,兼容该函数interval输出格式。

    返回值类型:interval

    示例:

    | ```
    gaussdb=# SELECT numtoyminterval(100, 'MONTH');  numtoyminterval  -----------------  8 years 4 mons (1 row)  gaussdb=# SET intervalstyle = oracle; SET gaussdb=# SELECT numtodsinterval(100, 'MONTH');  numtoyminterval  -----------------  8-4 (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/5f61f7b20c2d46cdbffea1f1da2f364c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=b4ev5RlKrBCSAnDKP611A8eIbDI%3D)

    此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下有效。

-   new_time(date, timezone1,timezone2)

    []()[]()描述:当timezone1所表示时区的日期时间为date的时候,返回此时timezone2所表示时区的日期时间值。

    返回值类型:timestamp

    示例:

    | ```
    gaussdb=# SELECT new_time('1997-10-10','AST','EST');       new_time        ---------------------  1997-10-09 23:00:00 (1 row) gaussdb=# SELECT NEW_TIME(TO_TIMESTAMP ('10-Sep-02 14:10:10.123000','DD-Mon-RR HH24:MI:SS.FF'), 'AST', 'PST');         new_time          -------------------------  2002-09-10 10:10:10.123 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/114de0e82efc40cfaa38d99b201f5910~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=bv9pYKEE1IsAJpeLkxERAKqhdCU%3D)

    此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。

-   sessiontimezone()

    []()[]()描述:当前会话的时区,无入参。

    返回值类型:text

    示例:

    | ```
    gaussdb=# SELECT SESSIONTIMEZONE;  session_time_zone  -------------------  PST8PDT (1 row) gaussdb=# SELECT LOWER(SESSIONTIMEZONE);    lower    -----------  @ 8 hours (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e6d062311d1a45aca2c03e57790d7b1e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=gc2V%2BN0Ue5qlisn2UADAlpkvwD8%3D)

    此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。

    当set session time zone的值为GMT+08:00/GMT-08:00格式时,会校验失败报错,此行为符合预期。如果打开s2开关后,使用JDBC创建连接时报“ERROR:invalid value for parameter "TimeZone" :"GMT-08:00"”的错误时,这说明驱动所在的应用给GaussDB数据库传递了相同的GMT格式的时区参数,可以通过如下两种方法解决:

    方法1: 调整应用端操作系统时区,将本地时区设置成地区格式,例如:Asia/Shanghai。

    方法2:应用侧更换为和版本匹配的JDBC驱动,JDBC驱动会将GMT格式的时区调整为数据库可识别的时区格式。

-   sys_extract_utc(timestamp| timestamptz)

    []()[]()描述:从具有时区偏移量或时区区域名称的日期时间值中提取UTC(协调世界时-以前称为格林威治平均时间)。如果未指定时区,则日期时间与会话时区关联。入参有timestamp和timestamptz两种形式。

    返回值类型:timestamp

    示例:

    | ```
    gaussdb=# SELECT SYS_EXTRACT_UTC(TIMESTAMP '2000-03-28 11:30:00.00');     sys_extract_utc    ---------------------  2000-03-28 03:30:00 (1 row) gaussdb=# SELECT SYS_EXTRACT_UTC(TIMESTAMPTZ '2000-03-28 11:30:00.00 -08:00');     sys_extract_utc    ---------------------  2000-03-28 19:30:00 (1 row) 
    ``` |
    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/2c350dee55dc4505b6f1b38fa3e4a10a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=TZTas6VnblsHIqqE%2FHBh77wqAa0%3D)

    此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。

-   tz_offset('time_zone_name' | '(+/-)hh:mi' | SESSIONTIMEZONE | DBTIMEZONE)

    []()[]()描述:入参有以上四种形式,返回入参所表示时区的UTC偏移量。

    返回值类型:text

    示例:

    | ```
    gaussdb=# SELECT TZ_OFFSET('US/Pacific');  tz_offset  -----------  -08:00 (1 row) gaussdb=# SELECT TZ_OFFSET(sessiontimezone);  tz_offset  -----------  +08:00 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/fe270be36f424ba8ae2332a1f5fb1969~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=ozFUcDQVJfitbaCPDTmKxgE3ijQ%3D)

    此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。

-   pg_sleep(seconds)

    []()[]()描述:服务器线程延迟时间,单位为秒。注意,当数据库调用该函数时,会获取相应的事务快照,相当于一个长事务,如果入参时间过长可能导致数据库oldestxmin无法推进,影响表的回收和查询性能。

    返回值类型:void

    示例:

    | ```
    gaussdb=# SELECT pg_sleep(10);  pg_sleep  ----------  (1 row) 
    ``` |
    | ---------------------------------------------------------------------- |

-   statement_timestamp()

    []()[]()描述:当前日期和时间(当前语句的开始)。

    返回值类型:timestamp with time zone

    示例:

    | ```
    gaussdb=# SELECT statement_timestamp();       statement_timestamp       -------------------------------  2017-09-01 17:04:39.119267+08 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   sysdate

    []()[]()描述:返回当前本条SQL执行时刻的系统日期和时间。

    返回值类型:timestamp

    示例:

    | ```
    gaussdb=# SELECT sysdate;        sysdate        ---------------------  2017-09-01 17:04:49 (1 row) 
    ``` |
    | ----------------------------------------------------------------------------------------------------------- |

-   sysdate([precision])

    []()[]()描述:返回函数执行时刻的系统日期和时间。

    参数:表示时间精度,int类型,范围为[0,6],缺省时默认值为0。

    返回值类型:timestamp without time zone

    示例:

    | ```
    gaussdb_m=# SELECT sysdate();       sysdate()       ---------------------  2023-08-21 17:17:42 (1 row) gaussdb_m=# SELECT sysdate(3);         sysdate(3)         -------------------------  2023-08-21 17:17:48.819 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a699038e5da34dd39e0faf7bfa33a09d~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=8dHsVESiysZPVFuYCAOnopq53GI%3D)

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

-   current_sysdate()

    []()[]()描述:返回当前本条SQL执行开始时刻的系统日期和时间。

    返回值类型:timestamp

    示例:

    | ```
    gaussdb=# SELECT current_sysdate();    current_sysdate    ---------------------  2023-06-20 20:09:02 (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------- |

-   timeofday()

    []()[]()描述:返回当前函数被调用时的系统时间的时间时间戳(像clock_timestamp,但是返回时为text)。

    返回值类型:text

    示例:

    | ```
    gaussdb=# SELECT timeofday();               timeofday               -------------------------------------  Fri Sep 01 17:05:01.167506 2017 CST (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   transaction_timestamp()

    []()[]()描述:当前事务开始的系统的日期及时间。

    返回值类型:timestamp with time zone,在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时返回timestamp without time zone。

    示例:

    | ```
    gaussdb=# SELECT transaction_timestamp();      transaction_timestamp      -------------------------------  2017-09-01 17:05:13.534454+08 (1 row) --mysql模式打开兼容性开关 gaussdb=#  SELECT transaction_timestamp();    transaction_timestamp     ----------------------------  2023-09-07 09:32:09.728998 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

-   add_months(d,n)

    []()[]()描述:用于计算时间点d再加上n个月的时间。

    d:timestamp类型的值,以及可以隐式转换为timestamp类型的值。

    n:INTEGER类型的值,以及可以隐式转换为INTEGER类型的值。

    返回值类型:timestamp

    示例:

    | ```
    gaussdb=# SELECT add_months(to_date('2017-5-29', 'yyyy-mm-dd'), 11) FROM sys_dummy;      add_months       ---------------------  2018-04-29 00:00:00 (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/f356723697334babac6a93a1ddffe66b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=48UgtLLZNbnxWGVDhB8hZdpz5GQ%3D)

    此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下:

    -   当计算结果大于公元9999年时会报错。
    -   参数n若入参为小数则不会被四舍五入,而是被截断。

-   last_day(d)

    []()[]()描述:用于计算时间点d当月最后一天的时间。

    返回值类型:timestamp

    示例:

    | ```
    gaussdb=# SELECT last_day(to_date('2017-01-01', 'YYYY-MM-DD')) AS cal_result;      cal_result       ---------------------  2017-01-31 00:00:00 (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c2629cf6aa13444cb32b976068926e4d~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=Q7FyBDSMiID43eZ79gyybJUs4gY%3D)

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时,使用last_day函数将会调用内置函数b_db_last_day,入参类型可为TEXT、DATE、DATETIME和TIME数据类型。返回值为date类型,支持输入datetime样式数字。

<!---->

-   months_between(d1, d2)

    []()[]()描述:用于计算时间点d1和时间点d2的月份差值,如果两个日期都是月末或天数相同,则返回整数,否则返回值带小数,按31天/月计算。

    返回值类型:numeric

    示例:

    ```
    gaussdb=# SELECT months_between(to_date('2022-10-31', 'yyyy-mm-dd'), to_date('2022-09-30', 'yyyy-mm-dd'));
     months_between 
    ----------------
                 1
    (1 row)

    gaussdb=# SELECT months_between(to_date('2022-10-30', 'yyyy-mm-dd'), to_date('2022-09-30', 'yyyy-mm-dd'));
     months_between 
    ----------------
                 1
    (1 row)

    gaussdb=# SELECT months_between(to_date('2022-10-29', 'yyyy-mm-dd'), to_date('2022-09-30', 'yyyy-mm-dd'));
        months_between     
    -----------------------
     .96774193548387096774
    (1 row)
    ```

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/67231d2d21b54ecd9827772336f663f4~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=%2Bzf6A690dMzu1GPTOwT0KGAhpI8%3D)

    此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下有效。

-   next_day(x,y)

    []()[]()描述:用于计算时间点x开始的下一个星期几(y)的时间。

    返回值类型:timestamp

    示例:

    | ```
    gaussdb=# SELECT next_day(timestamp '2017-05-25 00:00:00','Sunday')AS cal_result;      cal_result       ---------------------  2017-05-28 00:00:00 (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

<!---->

-   tinterval(abstime, abstime)

    []()[]()描述:用两个绝对时间创建时间间隔。

    返回值类型:tinterval

    示例:

    | ```
    gaussdb=# CALL tinterval(abstime 'May 10, 1947 23:59:12', abstime 'Mon May  1 00:30:30 1995');                       tinterval -----------------------------------------------------  ["1947-05-10 23:59:12+08" "1995-05-01 00:30:30+08"] (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

<!---->

-   tintervalend(tinterval)

    []()[]()描述:返回tinterval的结束时间。

    返回值类型:abstime

    示例:

    | ```
    gaussdb=# SELECT tintervalend('["Sep 4, 1983 23:59:12" "Oct4, 1983 23:59:12"]');       tintervalend ------------------------  1983-10-04 23:59:12+08 (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

<!---->

-   []()[]()tintervalrel(tinterval)

    描述:计算并返回tinterval的相对时间。

    返回值类型:reltime

    示例:

    | ```
    gaussdb=# SELECT tintervalrel('["Sep 4, 1983 23:59:12" "Oct4, 1983 23:59:12"]');  tintervalrel --------------  1 mon (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------------------------------- |

-   smalldatetime_ge(smalldatetime, smalldatetime)

    []()[]()描述:判断是否第一个参数大于第二个参数。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean

-   smalldatetime_cmp(smalldatetime, smalldatetime)

    []()[]()描述:对比smalldatetime是否相等。

    参数:smalldatetime, smalldatetime

    返回值类型:integer

-   smalldatetime_eq(smalldatetime, smalldatetime)

    []()[]()描述:对比smalldatetime是否相等。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean

-   smalldatetime_gt(smalldatetime, smalldatetime)

    []()[]()描述:判断是否第一个参数小于第二个参数。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean

-   smalldatetime_hash(smalldatetime)

    []()[]()描述:计算timestamp对应的哈希值。

    参数:smalldatetime

    返回值类型:integer

-   smalldatetime_in(cstring, oid, integer)

    []()[]()描述:输入timestamp。

    参数:cstring, oid, integer

    返回值类型:smalldatetime

-   smalldatetime_larger(smalldatetime, smalldatetime)

    []()[]()描述:返回较大的timestamp。

    参数:smalldatetime, smalldatetime

    返回值类型:smalldatetime

-   smalldatetime_le(smalldatetime, smalldatetime)

    []()[]()描述:判断是否第一个参数小于第二个参数。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean

-   smalldatetime_lt(smalldatetime, smalldatetime)

    []()[]()描述:判断是否第一个参数大于第二个参数。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean

-   smalldatetime_ne(smalldatetime, smalldatetime)

    []()[]()描述:比较两个timestamp是否不相等。

    参数:smalldatetime, smalldatetime

    返回值类型:boolean

-   smalldatetime_out(smalldatetime)

    []()[]()描述:timestamp转换为外部形式。

    参数:smalldatetime

    返回值类型:cstring

-   smalldatetime_send(smalldatetime)

    []()[]()描述:timestamp转换为二进制格式。

    参数:smalldatetime

    返回值类型:bytea

-   smalldatetime_smaller(smalldatetime, smalldatetime)

    []()[]()描述:返回较小的一个smalldatetime。

    参数:smalldatetime, smalldatetime

    返回值类型:smalldatetime

-   smalldatetime_to_abstime(smalldatetime)

    []()[]()描述:smalldatetime转换为abstime。

    参数:smalldatetime

    返回值类型:abstime

-   smalldatetime_to_time(smalldatetime)

    []()[]()描述:smalldatetime转换为time。

    参数:smalldatetime

    返回值类型:time without time zone

-   smalldatetime_to_timestamp(smalldatetime)

    []()[]()描述:smalldatetime转换为timestamp。

    参数:smalldatetime

    返回值类型:timestamp without time zone

-   smalldatetime_to_timestamptz(smalldatetime)

    []()[]()描述:smalldatetime转换为timestamptz。

    参数:smalldatetime

    返回值类型:timestamp with time zone

-   smalldatetime_to_varchar2(smalldatetime)

    []()[]()描述:smalldatetime转换为varchar2。

    参数:smalldatetime

    返回值类型:character varying

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/535de8938bbe41c5abc8ca2ea108f4fb~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=YxRYCV%2B2EYHND1XJxhr4krWPJ0w%3D)

    获取当前时间有多种方式,请根据实际业务从场景选择合适的接口:

    1.  以下接口按照当前事务的开始时刻返回值:

        ```
        CURRENT_DATE CURRENT_TIME
        CURRENT_TIME(precision)
        CURRENT_TIMESTAMP(precision)
        LOCALTIME
        LOCALTIMESTAMP
        LOCALTIME(precision)
        LOCALTIMESTAMP(precision)
        transaction_timestamp()
        now()
        ```

        其中CURRENT_TIME和CURRENT_TIMESTAMP(precision)传递带有时区的值;LOCALTIME和LOCALTIMESTAMP传递的值不带时区。CURRENT_TIME、LOCALTIME和LOCALTIMESTAMP可以指定精度参数,这会导致结果在秒字段中四舍五入到小数位数。如果没有精度参数,结果将被给予所能得到的全部精度。

        因为这些函数全部都按照当前事务的开始时刻返回结果,所以它们的值在事务运行的整个期间内都不改变。可以认为这是一个特性:目的是为了允许一个事务在“当前”时间上有一致的概念,这样在同一个事务里的多个修改可以保持同样的时间戳。其中transaction_timestamp()等价于CURRENT_TIMESTAMP(precision),表示当前语句所在事务的开启时间。now()等效于transaction_timestamp()。

        需要特别注意,当事务开启时,在sql_compatibility = 'ORA',且GUC参数a_format_date_timestamp值为on的情况下,CURRENT_DATE、CURRENT_TIMESTAMP(precision)、LOCALTIMESTAMP、LOCALTIMESTAMP(precision)函数返回的结果为当前SQL启动的时间戳,关闭GUC参数a_format_date_timestamp,则返回的结果为事务开启日期或日期及时间。

        在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时CURDATE、CURRENT_DATE、CURTIME、CURRENT_TIME、CURRENT_TIMESTAMP、NOW、LOCALTIME、LOCALTIMESTAMP、UTC_TIME、UTC_TIMESTAMP都返回SQL语句开始执行的时间,SYSDATE返回函数调用开始的时间。transaction_timestamp()依然表示事务开始时间,返回值类型改为timestamp without time zone。

    1.  以下接口返回当前语句开始时间:

        ```
        statement_timestamp()
        ```

        statement_timestamp()返回当前语句的开始时刻(更准确的说是收到客户端最后一条命令的时间)。statement_timestamp()和transaction_timestamp()在一个事务的第一条命令期间返回值相同,但是在随后的命令中却不一定相同。

    1.  以下接口返回函数被调用时的真实当前时间:

        ```
        clock_timestamp()
        timeofday() 
        ```

        clock_timestamp()返回真正的当前时间,因此它的值甚至在同一条SQL 命令中都会变化。timeofday()和clock_timestamp()相似,timeofday()也返回真实的当前时间,但是它的结果是一个格式化的text串,而不是timestamp with time zone值。

<!---->

-   convert_tz(dt, from_tz, to_tz)

    []()[]()描述:将时间日期值dt从from_tz时区转换到to_tz时区。

    参数:参数介绍如[表2](https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/devg-dist/gaussdb-12-0362.html#ZH-CN_TOPIC_0000001865745532__zh-cn_topic_0000001704537309_table169843432320)所示。

    []()[]()

    | 参数            | 类型                            | 描述                                                                                                                                                 | 取值范围                                                       |
    | :------------ | :---------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------- |
    | dt            | datetime、date、text、numeric类型。 | 时间日期值。                                                                                                                                             | [0000-01-01 00:00:00.000000, 9999-12-31 23:59:59.999999]。 |
    | from_tz/to_tz | ±hh:mm格式的字符串。                 | 表示相较于UTC时间的偏移,如'+08:00'。                                                                                                                           | [-15:59, 15:00]。                                          |
    | 命名时区。         | 如'MET'、'UTC'等。                | 具体请参考[PG_TIMEZONE_NAMES](https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/devg-dist/gaussdb-12-1309.html#ZH-CN_TOPIC_0000001865746496)系统视图。 |                                                            |

    返回值类型:datetime

    示例:

    | ```
    gaussdb=# SET b_format_dev_version = 's1'; SET gaussdb=# SET b_format_version = '5.7'; SET gaussdb=# SELECT convert_tz(cast('2023-01-01 10:10:10' as datetime), '+00:00', '+01:00');      convert_tz       ---------------------  2023-01-01 11:10:10 (1 row) gaussdb=# SELECT convert_tz(cast('2023-01-01' as date), '+00:00', '+01:00');      convert_tz       ---------------------  2023-01-01 01:00:00 (1 row) gaussdb=# SELECT convert_tz('2023-01-01 10:10:10', '+00:00', '+01:00');      convert_tz       ---------------------  2023-01-01 11:10:10 (1 row) gaussdb=# SELECT convert_tz('2023-01-01', '+00:00', '+01:00');      convert_tz       ---------------------  2023-01-01 01:00:00 (1 row) gaussdb=# SELECT convert_tz(20230101101010, '+00:00', '+01:00');      convert_tz       ---------------------  2023-01-01 11:10:10 (1 row) gaussdb=# SELECT convert_tz(20230101, '+00:00', '+01:00');      convert_tz       ---------------------  2023-01-01 01:00:00 (1 row) gaussdb=# SELECT convert_tz('2023-01-01 10:10:10', 'UTC', 'PRC');      convert_tz       ---------------------  2023-01-01 18:10:10 (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6d270b3b463d4973824841cf66a5de47~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=xtJuxE%2BRb1RmOmy15MPnRxTE95w%3D)

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

-   sec_to_time(seconds)

    []()[]()描述:将seconds表示的秒数转换为time类型的时间。

    参数:参数介绍如[表3](https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/devg-dist/gaussdb-12-0362.html#ZH-CN_TOPIC_0000001865745532__zh-cn_topic_0000001704537309_table831121810567)所示。

    []()[]()

    | 参数      | 类型              | 描述  | 取值范围                                                                    |
    | :------ | :-------------- | :-- | :---------------------------------------------------------------------- |
    | seconds | numeric、text类型。 | 秒数。 | [-3020399, +3020399],对应time类型范围[-838:59:59, 838:59:59],对于越界输入会截断到边界值。 |

    返回值类型:time without time zone

    示例:

    | ```
    gaussdb=# SET b_format_dev_version = 's1'; SET gaussdb=# SET b_format_version = '5.7'; SET gaussdb=# SELECT sec_to_time(2000);  sec_to_time  -------------  00:33:20 (1 row) gaussdb=# SELECT sec_to_time('-2000');  sec_to_time  -------------  -00:33:20 (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e0ece7fc16b045558d0a6dfadded0a71~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=a45jMC9496EzwUtUlxSgiZNy4qk%3D)

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

<!---->

-   []()[]()adddate(date, INTERVAL val unit)

    描述:将日期加上一定的时间间隔,返回一个新的日期。

    参数:参数介绍如[表4](https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/devg-dist/gaussdb-12-0362.html#ZH-CN_TOPIC_0000001865745532__zh-cn_topic_0000001704537309_table8793115711268)所示。

    []()[]()

    | 参数   | 类型                                 | 描述          | 取值范围                                                                                                                                                                                             |
    | :--- | :--------------------------------- | :---------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | date | 时间类型表达式、text、datetime、date或time等类型 | 要加上时间间隔的日期。 | 和类型范围一致。                                                                                                                                                                                         |
    | val  | 整数、浮点数、字符串等类型                      | 要加上的时间间隔。   | 和类型范围一致。                                                                                                                                                                                         |
    | unit | 关键字                                | 时间间隔的单位。    | YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND、MICROSECOND等,具体请参见[时间间隔表达式](https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/devg-dist/gaussdb-12-0423.html#ZH-CN_TOPIC_0000001911666933)。 |

    返回值类型:TEXT、DATE、DATETIME或TIME WITHOUT TIMEZONE。

    示例:

    | ```
    gaussdb=# SELECT ADDDATE('2018-05-01', INTERVAL 1 DAY);   adddate    ------------  2018-05-02 (1 row) 
    ``` |
    | -------------------------------------------------------------------------------------------------------------- |

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/83c98fe27c7341dab663f41869a1bb15~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=lCOnNAMPst82Qy5iz%2F%2BgiSUHhPg%3D)

    1.  该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    1.  在prepare语句中,adddate的第二个参数为interval表达式,当使用参数$1完全替代时,会导致结果非预期,例如:prepare p1 as select adddate('2023-01-01 10:00:00', $1); execute p1(interval 13 hour);该用例返回非预期结果为'2023-01-01 10:00:00'。

-   adddate(expr, days)

    []()[]()描述:将日期加上一定的天数值,返回一个新的日期。

    参数:

    -   expr:指定开始的日期时间,时间类型表达式,TEXT、DATE、DATETIME或TIME等类型。
    -   days:需要加上的天数,int类型。

    返回值类型:TEXT、DATE、DATETIME或TIME WITHOUT TIMEZONE

    示例:

    ```
    gaussdb=# SELECT ADDDATE('2018-05-01', 1);
      adddate   
    ------------
     2018-05-02
    (1 row)
    ```

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c26b5372ffaa4df3a43e2f4dc9fb127c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402436&x-signature=qgXp7O1m%2FEWw%2F0gkf6Odc6tQH0s%3D)

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。



更多详情请参考GaussDB 文档中心:<https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/productdesc/qlh_03_0001.html>