全部產品
Search
文件中心

Hologres:日期和時間函數

更新時間:Oct 18, 2024

本文為您介紹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