日期和时间函数

本文为您介绍Hologres支持的时间和日期函数及使用示例。

类型

函数

功能

类型转换函数

MAKE_DATE

使用年、月、日创建日期,默认支持的时间范围为1925~2282年。

TO_CHAR

将时间戳、整数、实数和双精度数转换为字符串。

TO_DATE

将字符串转换为日期,默认支持的时间范围为1925~2282年。

TO_TIMESTAMP

将字符串转换为时间戳或将时间戳转换为日期。

时间日期加减乘除函数

ADD_MONTHS

为指定日期增加月份。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

DATEADD

根据指定的单位和数值,进行日期的增减运算,默认支持的时间范围为1925~2282年。

DATEDIFF

计算两个日期或时间戳之间的时间差,默认支持的时间范围为1925~2282年。

MONTHS_BETWEEN

计算两个日期之间相差的月数。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

NEXT_DAY

计算指定日期后的下一个特定星期几所在的日期。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

时间日期相加:+

将时间日期相加。

时间日期相减:-

将时间日期相减。

时间日期相乘:*

将时间日期相乘。

时间日期相除:/

将时间日期相除。

时间日期截取函数

DATE_PART

从一个日期时间表达式(TIMESTAMP)中提取特定的部分(比如年、月、日、小时等),等效于EXTRACT函数。

DATE_TRUNC

将时间日期数据截断到指定的时间单位。

EXTRACT

从一个日期时间表达式(TIMESTAMP)中提取特定的部分(比如年、月、日、小时等)。

LAST_DAY

获取指定日期所在月份的最后一天日期,默认支持的时间范围为1925~2282年。

ORACLE_LAST_DAY

获取指定日期所在月份的最后一天日期,默认支持的时间范围为1925~2282年。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

ROUND

把日期时间圆整到最近的时间单位。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

TRUNC

将日期或时间戳截断到指定的时间单位。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

获取当前时间日期函数

CLOCK_TIMESTAMP

获取当前时刻。

CURRENT_DATE

获取当前日期。

CURRENT_TIMESTAMP

获取当前事务的开始时刻,等效于TRANSACTION_TIMESTAMPNOW

LOCALTIMESTAMP

获取不包含时区的当前时间。

NOW

获取当前事务的开始时刻,等效于TRANSACTION_TIMESTAMPCURRENT_TIMESTAMP

STATEMENT_TIMESTAMP

获取当前语句的开始时刻。

TIMEOFDAY

获取当前时刻,类似于CLOCK_TIMESTAMP。但TIMEOFDAY函数返回的时间是以格式化文本字符串的形式呈现。

TRANSACTION_TIMESTAMP

获取当前事务的开始时刻,等效于CURRENT_TIMESTAMPNOW

其他

ISFINITE

判断DATE类型的日期是否为有限值,即非无穷大或非无穷小。

日期时间转换函数

TO_CHAR

  • 描述

    • 将时间戳转换为字符串,默认支持的时间范围为1925~2282年。

      TO_CHAR(TIMESTAMP|TIMESTAMPTZ, TEXT)

      使用说明:

      • 支持24小时制和12小时制的转换。其中,HH24对应24小时制,HH12对应12小时制,默认为12小时制。

      • YYYY对应年,MM对应月,DD对应日,HH对应时,MI对应分,SS对应秒。

      • 自Hologres V1.1.31版本开始,在SQL前执行set hg_experimental_functions_use_pg_implementation = 'to_char';或者set hg_experimental_functions_use_pg_implementation = 'to_char,to_date,to_timestamp';可支持所有时间。

        说明

        使用该GUC参数后,查询性能约有50%的损失,升级至Hologres V1.1.42及以上版本后,约有20%的损失。

    • 将整数转换为字符串。

      TO_CHAR(INT, TEXT)
    • 将实数和双精度数转换为字符串。

      TO_CHAR(DOUBLE PRECISION, TEXT)
  • 返回值说明

    返回TEXT类型。

  • 示例

    • 将时间戳转换为24小时制。

      --返回结果:13:48:30
      SELECT TO_CHAR(current_timestamp, 'HH24:MI:SS');
      
      --返回结果:2024-08-05
      SELECT TO_CHAR(current_timestamp, 'YYYY-MM-DD');
    • 将时间戳转换为12小时制。

      --返回结果:01:50:42 PM
      SELECT TO_CHAR(current_timestamp, 'HH12:MI:SS AM');
      
      --返回结果:12:30:00 AM
      SELECT TO_CHAR(time '00:30:00', 'HH12:MI:SS AM');
    • 时间戳字段的转换。

      CREATE TABLE time_test(
        a text,
        b TIMESTAMPTZ );
      INSERT INTO time_test VALUES ('2001-09-28 03:00:00','2004-10-19 10:23:54+08');
      
      --返回结果:10:23:54
      SELECT TO_CHAR(b, 'HH24:MI:SS') FROM time_test;
      
      --将text的字段转换为日期,返回结果:2001-09-28
      SELECT TO_CHAR(to_timestamp(a, 'YYYY-MM-DD'),'YYYY-MM-DD')FROM time_test;
    • 跨时区的时间戳转换。

      CREATE TABLE timestamptz_test(
        a TIMESTAMPTZ);
      
      INSERT INTO timestamptz_test VALUES ('2023-03-21 10:23:54+02');
      • 不指定时区,则默认将a列转为系统时区(东八区)后转换为字符串。

        --返回结果:2023-03-21 16:23:54
        SELECT TO_CHAR(a, 'YYYY-MM-DD HH24:MI:SS') FROM timestamptz_test;
      • 指定时区为美东时区后,将a列其转换为字符串。

        --返回结果:2023-03-21 04:23:54
        SELECT TO_CHAR(a at time zone 'US/Eastern', 'YYYY-MM-DD HH24:MI:SS') FROM timestamptz_test;
    • 整数转换为字符串。

      --返回结果: 125
      SELECT TO_CHAR(125, '999');
    • 双精度数转换为字符串。

      --返回结果: 125.8
      SELECT TO_CHAR(125.8::real, '999D9');

TO_DATE

  • 描述:将字符串转换为日期,默认支持的时间范围为1925~2282年。

    TO_DATE(<text_date> TEXT, <format_mask> TEXT)
  • 使用说明

    自Hologres V1.1.31版本开始,在SQL前执行set hg_experimental_functions_use_pg_implementation = 'to_date';或者set hg_experimental_functions_use_pg_implementation = 'to_char,to_date,to_timestamp';可支持所有时间。

    说明

    使用该GUC参数后,查询性能约有50%的损失,升级至Hologres V1.1.42及以上版本后,约有20%的损失。

  • 参数说明

    • text_date:必填,需要转换的字符串。

    • format_mask:必填,转换为日期的格式。

  • 返回值说明

    返回TEXT类型。

  • 示例

    • 字符串转换为日期。

      --返回结果:2000-12-05
      SELECT TO_DATE('05 Dec 2000', 'DD Mon YYYY');
      
      --返回结果:2001-03-24
      SELECT TO_DATE('2001 03 24', 'YYYY-MM-DD');
    • TEXT类型的表字段转换为日期。

      CREATE TABLE time_test(a TEXT);
      INSERT INTO time_test VALUES ('2001-09-28 03:00:00');
      SELECT TO_DATE(a, 'YYYY-MM-DD') FROM time_test;

      返回结果如下。

        to_date
      ------------
       2001-09-28

TO_TIMESTAMP

  • 描述:

    • 将字符串转换为时间戳,默认支持时间范围为1925~2282年。

      TO_TIMESTAMP(<text_date> TEXT, <format_mask> TEXT)
      • 使用说明

        • 执行结果中包含+08时。

        • 自Hologres V1.1.31版本开始,在SQL前执行set hg_experimental_functions_use_pg_implementation = 'to_timestamp';或者set hg_experimental_functions_use_pg_implementation = 'to_char,to_date,to_timestamp';可支持所有时间。

          说明

          使用该GUC参数后,查询性能约有50%的损失,升级至Hologres V1.1.42及以上版本后,约有20%的损失。

      • 参数说明

        • text_date:必填,需要转换成时间戳的字符串。

        • format_mask:必填,转换成时间戳的格式。

    • 将时间戳转换为日期。

      TO_TIMESTAMP(DOUBLE PRECISION)
      说明

      从1970-01-01 00:00:00+00的秒数开始转换。

  • 返回值说明

    返回TIMESTAMPTZ类型。

  • 使用示例:

    • 字符串转换为时间。

      SELECT TO_TIMESTAMP('05 Dec 2000', 'DD Mon YYYY');

      返回结果如下。

            to_timestamp
      ------------------------
       2000-12-05 00:00:00+08
    • 将字符串类型转换为时间戳。

      CREATE TABLE time_test(a TEXT);
      INSERT INTO time_test VALUES ('2001-09-28 03:00:00');
      SELECT TO_TIMESTAMP(a, 'YYYY-MM-DD') FROM time_test;

      返回结果如下。

            to_timestamp
      ------------------------
       2001-09-28 00:00:00+08
    • 秒级时间戳的转换。

      --返回结果:1975-03-06 03:38:16+08
      SELECT TO_TIMESTAMP(163280296);
    • 毫秒级时间戳的转换。

      --返回结果:2021-09-28 12:22:41+08
      SELECT TO_TIMESTAMP(1632802961000/1000);

MAKE_DATE

  • 描述:使用年、月、日创建日期,默认支持的时间范围为1925~2282年。

    MAKE_DATE(<year> INT, <month> INT, <day> INT)
  • 使用说明

    Hologres V2.0.29起支持该函数,暂不支持常量入参。

  • 返回值说明

    返回DATE类型。

  • 示例

    --返回结果:2013-07-15
    SELECT MAKE_DATE(2013, 7, 15);

    返回结果如下。

    make_date
    ------------
     2013-07-15

时间日期加减乘除函数

DATEADD

  • 描述:根据指定的单位和数值,进行日期的增减运算,默认支持的时间范围为1925~2282年。

    DATEADD(<d> DATE|TIMESTAMP|TIMESTAMPTZ, <num> BIGINT, <str> TEXT)
  • 使用说明

    目前如下Hologres实例版本支持使用该函数:

    • V2.0.31至V2.1.0版本。

    • V2.1.13及以上版本。

    说明

    且暂不支持常量入参写入。

  • 参数说明

    • d:必填,原始的日期或时间值。

    • num:必填,增加或减少的数量。

    • str:必填,指定的时间单位,包括:年(yyyy、year)、月(mm、month、mon)、日(dd、day)、时(hh、hour)、分(mi)、秒(ss)。

  • 返回值说明

    返回DATE、TIMESTAMP、TIMESTAMPTZ类型。

  • 示例

    CREATE TABLE test_dateadd (a TIMESTAMP);
    INSERT INTO test_dateadd VALUES ('2005-02-28 00:00:00');
    
    -- 指定日期增加一个月
    SELECT DATEADD(a , 1, 'mm') FROM test_dateadd;

    返回结果如下。

           dateadd
    ---------------------
     2005-03-28 00:00:00

ADD_MONTHS

  • 描述:为指定日期增加月份。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

    ADD_MONTHS(<d> DATE, <month> INT)
  • 参数说明

    • d:必填,原始日期。

    • month:必填,要添加到原始日期的整数。

  • 返回值说明

    返回DATE类型。

  • 示例

    SELECT ADD_MONTHS(current_date, 2);

    返回结果如下。

     add_months
    ------------
     2024-10-05

DATEDIFF

  • 描述:计算两个日期或时间戳之间的时间差,默认支持的时间范围为1925~2282年。

    DATEDIFF(<d1> DATE|TIMESTAMP|TIMESTAMPTZ, <d2> DATE|TIMESTAMP|TIMESTAMPTZ, <str> TEXT)
  • 使用说明

    目前如下Hologres实例版本支持使用该函数:

    • V2.0.31至V2.1.0版本。

    • V2.1.13及以上版本。

    说明

    不支持全部入参均为常量。

  • 参数说明

    • d1:必填,第一个日期或时间戳值。

    • d2:必填,第二个日期或时间戳值。

    • str:必填,指定计算时间差的时间单位,包括:年(yyyy、year)、月(mm、month、mon)、日(dd、day)、时(hh、hour)、分(mi)、秒(ss)。

  • 返回值说明

    返回BIGINT类型,在指定的单位下时间差值不足1时,默认返回为0。

    例如:2023-12-31与2024-01-01在年(year)单位下差值为0。

    说明

    若需上述场景返回1,可在SQL前执行set hg_experimental_datediff_use_presto_impl = off;关闭该GUC参数。

  • 示例

    CREATE TABLE test_datediff (a TIMESTAMP);
    INSERT INTO test_datediff VALUES ('2005-02-28 00:00:00');
    
    -- 计算两个日期的分钟差值
    SELECT DATEDIFF(a , '2005-03-02 00:00:00', 'mi') FROM test_datediff;

    返回结果如下。

     datediff
    ----------
        -2880

MONTHS_BETWEEN

  • 描述:计算两个日期之间相差的月数。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

    MONTHS_BETWEEN(DATE, DATE)
  • 返回值说明

    返回INT类型。

  • 示例

    • 示例1

      --返回结果:2
      SELECT MONTHS_BETWEEN('2022-01-01', '2021-11-01');
    • 示例2

      --返回结果:-2
      SELECT MONTHS_BETWEEN('2021-11-01', '2022-01-01');

NEXT_DAY

  • 描述:计算指定日期后的下一个特定星期几所在的日期。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

    NEXT_DAY(<d> DATE, <str> TEXT|INT)
  • 参数说明

    • d:必填,指定日期。

    • str:必填,表示星期几的英文字符串,如Friday。也可以是表示星期几的数字,取值范围为1~7,其中1代表星期日,2代表星期一,以此类推。

  • 返回值说明

    返回DATE类型。

  • 示例

    • 示例1

      --返回结果:2022-05-06
      SELECT NEXT_DAY('2022-05-01', 'FRIDAY');
    • 示例2

      --返回结果:2022-05-06
      SELECT NEXT_DAY('2022-05-01', 5);

时间日期相加:+

返回类型

示例

结果

DATE

从指定日期开始向前加7天

SELECT date '2001-09-28' + integer '7';

2001-10-05

当前日期向前加3天

SELECT current_date+ integer '3 ';

2022-12-10

当前时间向前加1天

SELECT to_char(current_date+ interval '1 day','yyyy-mm-dd');

2022-12-09

TIMESTAMP

从指定日期开始向前加3个小时(0点开始计算)

SELECT date '2001-09-28' + time '03:00';

2001-09-28 03:00:00

从指定日期开始向前加1个小时(0点开始计算)

SELECT date '2001-09-28' + interval '1 hour';

2001-09-28 01:00:00

TIMESTAMPTZ

当前时间向前加1天

SELECT now()+interval '1 day';

2022-12-08 20:09:19.388465+08

当前时间向前加1个月

SELECT now()+interval '1 month';

2023-01-08 20:21:50.993481+08

当前时间向前加2年

 SELECT now()+interval '2 year';

2024-12-08 20:22:49.416343+08

时间日期相减:-

返回类型

用例

结果

INTEGER

指定日期相减

SELECT date '2001-10-01' - date '2001-09-28';

3

DATE

指定日期减7天

SELECT date '2001-10-01' - integer '7';

2001-09-24

TIMESTAMP

指定日期减3个小时

SELECT date '2001-09-28' - time '03:00';

2001-09-27 21:00:00

指定日期减1个小时

 SELECT date '2001-09-28' - interval '1 hour';

2001-09-27 23:00:00

当前时间减2天

SELECT now()-interval '2 day';

2022-12-06 20:27:21.094258+08

时间日期相乘:*

返回类型

用例

结果

INTERVAL

时间相乘

SELECT 21 * interval '3 day';

0 years 0 mons 63 days 0 hours 0 mins 0.0 secs

时间日期相除:/

返回类型

用例

结果

INTERVAL

时间相除

SELECT interval '1 hour' / double precision '1.5';

0 years 0 mons 0 days 0 hours 40 mins 0.0 secs

时间日期截取函数

LAST_DAY

  • 描述:获取指定日期所在月份的最后一天日期,默认支持的时间范围为1925~2282年。

    LAST_DAY(DATE|TIMESTAMP|TIMESTAMPTZ)
  • 使用说明

    目前仅如下Hologres版本支持使用该函数:

    说明

    该函数暂不支持常量写入。

    • V2.0.31至V2.1.0版本

    • V2.1.13及以上版本

  • 返回值说明

    返回DATE类型。

  • 使用示例

    获取2004-02-28 00:00:00所在月份的最后一天日期。

    CREATE TABLE test_last_day (a TIMESTAMP);
    INSERT INTO test_last_day VALUES ('2004-02-28 00:00:00');
    
    SELECT LAST_DAY(a) FROM test_last_day;

    返回结果如下。

      last_day
    ------------
     2004-02-29

ORACLE_LAST_DAY

  • 描述:获取指定日期所在月份的最后一天日期,默认支持的时间范围为1925~2282年。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

    ORACLE_LAST_DAY(DATE)
  • 返回值说明

    返回DATE类型。

  • 示例

    SELECT ORACLE_LAST_DAY('2022-05-01');

    返回结果如下。

     oracle_last_day
    -----------------
     2022-05-31

EXTRACT

  • 描述:从一个日期时间表达式(TIMESTAMP)中提取特定的部分(比如年、月、日、小时等)。

    EXTRACT(field FROM TIMESTAMP)
    说明

    field常量值取值包括:century(世纪)、day(天)、decade(十年)、dow(一周中的第几天,周日为0)、isodow(一周中的第几天,周日为7)、doy(一年中的第几天)、epoch(纪元)、hour(小时)、minute(分钟)、month(月份)、quarter(季度)、second(秒)、week(周)和year(年)。

  • 返回值说明

    返回DOUBLE PRECISION类型。

  • 示例

    • 获取指定日期的小时数。

      -- 返回结果:20
      SELECT EXTRACT(hour FROM timestamp '2001-02-16 20:38:40');
    • 获取当前时间的分钟数。

      -- 返回结果:12
      SELECT EXTRACT(minute FROM NOW());
    • 获取1970年到字段值时间的秒数。

      CREATE TABLE time_test(a TEXT);
      INSERT INTO time_test VALUES ('2001-09-28 03:00:00');
      SELECT EXTRACT(epoch FROM to_timestamp(a, 'YYYY-MM-DD')) FROM time_test;

      返回结果如下。

       date_part
      ------------
       1001606400

DATE_PART

  • 描述:从一个日期时间表达式(TIMESTAMP)中提取特定的部分(比如年、月、日、小时等),等效于EXTRACT函数。

    DATE_PART(<str> TEXT, <d> TIMESTAMP)
  • 参数说明

    • str:必填,指定提取的部分,取值包括:century(世纪)、day(天)、decade(十年)、dow(一周中的第几天,周日为0)、isodow(一周中的第几天,周日为7)、doy(一年中的第几天)、epoch(纪元以来的天数)、hour(小时)、minute(分钟)、month(月份)、quarter(季度)、second(秒)、week(周)和year(年)。

    • d:必填,日期时间表达式。

  • 返回值说明

    返回DOUBLE PRECISION类型。

  • 示例

    • 示例1:获取指定日期的小时数

      SELECT DATE_PART('hour', timestamp '2001-02-16 16:38:40');

      返回结果如下。

       date_part
      -----------
              16
    • 示例2:从1月1日到指定日期的周数。

      SELECT DATE_PART('week', TO_DATE('2022-10-11', 'YYYY-MM-DD'));

      返回结果如下。

       date_part
      -----------
              41
    • 示例3:从1月1日到指定日期的月数

      SELECT DATE_PART('month', TO_DATE('2022-10-11', 'YYYY-MM-DD'));

      返回结果如下。

       date_part
      -----------
              10

DATE_TRUNC

  • 描述:将时间日期数据截断到指定的时间单位。

    DATE_TRUNC(<str> TEXT, <d> TIME|TIMESTAMP|TIMESTAMPTZ)
  • 参数说明

    • str:必填,要截断到的时间单位,包括century、decade、year、quarter、month、week、day、hour、minute、second等。

    • d:必填,待截取的时间日期。

  • 返回值说明

    返回TIMESTAMP、TIMESTAMPTZ类型。

  • 使用示例

    • 示例1:截断指定时间戳到小时。

      SELECT DATE_TRUNC('hour', time '12:38:40');

      返回结果如下。

       date_trunc
      ------------
       12:00:00
    • 示例2:截断指定时间戳到天。

      SELECT DATE_TRUNC('day', timestamptz'2001-02-16 20:38:40+08');

      返回结果如下。

             date_trunc
      ------------------------
       2001-02-16 00:00:00+08
    • 示例3:截断指定时间戳到月。

      SELECT DATE_TRUNC('month', timestamp '2001-02-16 18:38:40');

      返回结果如下。

           date_trunc
      ---------------------
       2001-02-01 00:00:00
    • 示例4:截取当前月的1号12点。

      SELECT DATE_TRUNC('month',now()) +interval '12h';

      返回结果如下。

              ?column?
      ---------------------
       2024-08-01 12:00:00+08
    • 示例5:截取当日9点。

      SELECT DATE_TRUNC('day',now()) + interval '9h';

      返回结果如下。

              ?column?
      ------------------------
       2024-08-08 09:00:00+08
    • 示例6:截取每周的今天。

      SELECT DATE_TRUNC('day',now()) + interval '7d';

      返回结果如下。

              ?column?
      ------------------------
       2024-08-15 00:00:00+08

TRUNC

  • 描述:将日期或时间戳截断到指定的时间单位。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

    TRUNC(<d> DATE|TIMESTAMP [, <str> TEXT])
  • 参数说明

    • d:必填,要被截断的日期时间。如果传入的是TIMESTAMPTZ,剩余部分会置为0。

    • str:可选,要截断到的时间单位,如果不填写,则返回原日期。取值包含:Y表示返回所属年份的第一天,Q表示返回所属季度的第一天,更多选项详情,请参见Oracle文档

  • 返回值说明

    返回DATE、TIMESTAMPTZ类型。

  • 示例

    • 示例1

      SELECT TRUNC('2022-05-22'::date,'Y');

      返回结果如下。

         trunc
      ------------
       2022-01-01
    • 示例2

      SELECT TRUNC('2022-05-22 13:11:22'::timestamp,'Y');

      返回结果如下。

              trunc
      ---------------------
       2022-01-01 00:00:00
    • 示例3

      SELECT TRUNC('2022-05-22 13:11:22'::timestamp,'Q');

      返回结果如下。

              trunc
      ---------------------
       2022-04-01 00:00:00
    • 示例4

      SELECT TRUNC('2022-05-22 13:11:22'::timestamp);

      返回结果如下。

              trunc
      ---------------------
       2022-05-22 00:00:00

ROUND

  • 描述:把日期时间圆整到最近的时间单位。该函数是Oracle兼容函数,需要先安装orafce扩展,具体请参见Oracle兼容函数

    ROUND(<d> DATE|TIMESTAMPTZ [, <str> TEXT])
  • 参数说明

    • d:必填,要被圆整的日期时间,如果传入的是TIMESTAMPTZ,剩余部分会置为0。

    • str:可选,时间单位,如果不输入,则圆整到最近的一天。取值包含:Y表示圆整到最近的年份第一天,更多选项请参见Oracle文档

  • 返回值说明

    返回DATE、TIMESTAMPTZ类型。

  • 使用示例:

    • 示例1

      SELECT ROUND('2022-05-22'::date,'Y');

      返回结果如下。

         round
      ------------
       2022-01-01
    • 示例2

      SELECT ROUND('2022-07-22'::date,'Y');

      返回结果如下。

         round
      ------------
       2023-01-01
    • 示例3

      SELECT ROUND('2022-07-22 13:11:22'::timestamp,'Y');

      返回结果如下。

              round
      ---------------------
       2023-01-01 00:00:00
    • 示例4

      SELECT ROUND('2022-02-22 13:11:22'::timestamp);

      返回结果如下。

              round
      ---------------------
       2022-02-23 00:00:00

获取当前时间日期函数

CURRENT_DATE

  • 描述:获取当前日期。

    CURRENT_DATE
  • 返回值说明

    返回DATE类型。

  • 示例

    SELECT CURRENT_DATE;

    返回结果如下。

     current_date
    --------------
     2024-08-08

CURRENT_TIMESTAMP

  • 描述:获取当前事务的开始时刻,等效于TRANSACTION_TIMESTAMPNOW

    CURRENT_TIMESTAMP
    说明

    在事务的整个运行周期内不改变。

  • 返回值说明

    返回TIMESTAMPTZ类型。

  • 示例

    SELECT CURRENT_TIMESTAMP;

    返回结果如下。

           current_timestamp
    -------------------------------
     2024-08-08 14:55:11.006068+08

CLOCK_TIMESTAMP

  • 描述:获取当前时刻。

    clock_timestamp()
    说明

    在同一条命令中也会发生变化。

  • 返回值说明

    返回TIMESTAMPTZ类型。

  • 示例

    SELECT clock_timestamp();

    返回结果如下。

            clock_timestamp
    -------------------------------
     2024-08-08 14:57:43.569109+08

LOCALTIMESTAMP

  • 描述:获取不包含时区的当前时间。

    LOCALTIMESTAMP
  • 返回值说明

    返回TIMESTAMPTZ类型。

  • 示例

    SELECT LOCALTIMESTAMP;

    返回结果如下。

          localtimestamp
    ---------------------------
     2024-08-08 15:00:59.13245

NOW

  • 描述:获取当前事务的开始时刻,等效于TRANSACTION_TIMESTAMPCURRENT_TIMESTAMP

    NOW()
    说明

    在事务的整个运行周期内不改变。

  • 返回值说明

    返回TIMESTAMPTZ类型。

  • 示例

    SELECT NOW();

    返回结果如下。

                  now
    -------------------------------
     2024-08-08 15:02:50.270501+08

STATEMENT_TIMESTAMP

  • 描述:获取当前语句的开始时刻。

    STATEMENT_TIMESTAMP()
    说明

    在事务的不同命令中返回值不同。

  • 返回值说明

    返回TIMESTAMPTZ类型。

  • 示例

    SELECT STATEMENT_TIMESTAMP();

    返回结果如下。

          statement_timestamp
    -------------------------------
     2024-08-08 15:06:14.772939+08

TIMEOFDAY

  • 描述:获取当前时刻,类似于CLOCK_TIMESTAMP。但TIMEOFDAY函数返回的时间是以格式化文本字符串的形式呈现。

    TIMEOFDAY()
  • 返回值说明

    返回TEXT类型。

  • 示例

    SELECT TIMEOFDAY();

    返回结果如下。

                  timeofday
    -------------------------------------
     Thu Aug 08 15:08:16.599369 2024 CST

TRANSACTION_TIMESTAMP

  • 描述:获取当前事务的开始时刻,等效于CURRENT_TIMESTAMPNOW

    TRANSACTION_TIMESTAMP()
    说明

    在事务的整个运行周期内不改变。

  • 返回值说明

    返回TIMESTAMPTZ类型。

  • 示例

    SELECT TRANSACTION_TIMESTAMP();

    返回结果如下。

         transaction_timestamp
    -------------------------------
     2024-08-08 15:11:10.329005+08

其他

ISFINITE

  • 描述:

    • 判断DATE类型的日期是否为有限值,即非无穷大或非无穷小。

      ISFINITE(DATE)
    • 判断时间戳是否为有限值。

      ISFINITE(TIMESTAMP)
  • 返回值说明

    返回BOOLEAN类型。如果是有限值,则返回true(t),如果是无限值,则返回false(f)。

  • 使用示例

    • 示例1

      SELECT ISFINITE(date '2001-02-16');

      返回结果如下。

       isfinite
      ----------
       t
    • 示例2

      SELECT ISFINITE(timestamp '2001-02-16 21:28:30');

      返回结果如下。

       isfinite
      ----------
       t

常用SQL示例

  • 示例1:N小时内的计算。

    SELECT NOW()+interval '2 hour';

    返回结果如下。

    ?column?
    ---------------------
    2022-12-29 13:43:58.321104+08
  • 示例2:日期转换为时间戳。

    SELECT EXTRACT(epoch FROM current_timestamp);

    返回结果如下。

    date_part
    ---------------------
    1672285506.296279
  • 示例3:日期字段和数字字段相加。

    CREATE TABLE date_test1(
        a DATE,
        b INT );
    INSERT INTO date_test1 VALUES ('2021-09-28','12');
    SELECT a + (b || ' month')::interval FROM date_test1;   

    返回结果如下。

    ?column?
    --------------------
     2022-09-28 00:00:00
  • 示例4:时间戳转换TIMESTAMP。

    SELECT TO_TIMESTAMP(TO_CHAR(20211027172045,'9999-99-99 99:99:99'),'YYYY-MM-DD HH24:MI:SS');

    返回结果如下。

    to_timestamp
    ----------------------
    2021-10-27 17:20:45+08
  • 示例5:时间的截取。

    SELECT EXTRACT(mon FROM now());

    返回结果如下。

    date_part
    ---------
    12
  • 示例6:整数相除场景。

    两个整数相除有余数的场景中,Hologres会返回整数舍弃余数。示例:10/3,结果是3,如果需要显示余数,需要显式做类型转换,转成float再计算,如下所示:

    SELECT 10/3::float;

    返回结果如下。

    ?column?
    ---------
    3.3333333333333335