PostgreSQL - 日期/時間函式和運算子



我們在資料型別章節中討論了日期/時間資料型別。現在,讓我們看看日期/時間運算子和函式。

下表列出了基本算術運算子的行為:

運算子 示例 結果
+ date '2001-09-28' + integer '7' date '2001-10-05'
+ date '2001-09-28' + interval '1 hour' timestamp '2001-09-28 01:00:00'
+ date '2001-09-28' + time '03:00' timestamp '2001-09-28 03:00:00'
+ interval '1 day' + interval '1 hour' interval '1 day 01:00:00'
+ timestamp '2001-09-28 01:00' + interval '23 hours' timestamp '2001-09-29 00:00:00'
+ time '01:00' + interval '3 hours' time '04:00:00'
- - interval '23 hours' interval '-23:00:00'
- date '2001-10-01' - date '2001-09-28' integer '3' (天)
- date '2001-10-01' - integer '7' date '2001-09-24'
- date '2001-09-28' - interval '1 hour' timestamp '2001-09-27 23:00:00'
- time '05:00' - time '03:00' interval '02:00:00'
- time '05:00' - interval '2 hours' time '03:00:00'
- timestamp '2001-09-28 23:00' - interval '23 hours' timestamp '2001-09-28 00:00:00'
- interval '1 day' - interval '1 hour' interval '1 day -01:00:00'
- timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' interval '1 day 15:00:00'
* 900 * interval '1 second' interval '00:15:00'
* 21 * interval '1 day' interval '21 days'
* double precision '3.5' * interval '1 hour' interval '03:30:00'
/ interval '1 hour' / double precision '1.5' interval '00:40:00'

以下是所有重要的日期和時間相關函式列表。

序號 函式 & 描述
1 AGE()

相減

2 CURRENT_DATE/TIME()

當前日期和時間

3 DATE_PART()

獲取子欄位(等效於 extract)

4 EXTRACT()

獲取子欄位

5 ISFINITE()

測試有限日期、時間和區間(非 +/-infinity)

6 JUSTIFY

調整區間

AGE(timestamp, timestamp), AGE(timestamp)

序號 函式 & 描述
1

AGE(timestamp, timestamp)

當使用 TIMESTAMP 形式的第二個引數呼叫時,AGE() 會相減,產生一個使用年和月的“符號”結果,其型別為 INTERVAL。

2

AGE(timestamp)

當只使用 TIMESTAMP 作為引數呼叫時,AGE() 會從 current_date(午夜)相減。

函式 AGE(timestamp, timestamp) 的示例:

testdb=# SELECT AGE(timestamp '2001-04-10', timestamp '1957-06-13');

上面給出的 PostgreSQL 語句將產生以下結果:

           age
-------------------------
 43 years 9 mons 27 days

函式 AGE(timestamp) 的示例:

testdb=# select age(timestamp '1957-06-13');

上面給出的 PostgreSQL 語句將產生以下結果:

           age
--------------------------
 55 years 10 mons 22 days

CURRENT_DATE/TIME()

PostgreSQL 提供了許多返回與當前日期和時間相關的值的函式。以下是一些函式:

序號 函式 & 描述
1

CURRENT_DATE

返回當前日期。

2

CURRENT_TIME

返回帶時區的數值。

3

CURRENT_TIMESTAMP

返回帶時區的數值。

4

CURRENT_TIME(precision)

可以選擇一個精度引數,這會導致結果舍入到秒欄位中的那麼多小數位。

5

CURRENT_TIMESTAMP(precision)

可以選擇一個精度引數,這會導致結果舍入到秒欄位中的那麼多小數位。

6

LOCALTIME

返回不帶時區的數值。

7

LOCALTIMESTAMP

返回不帶時區的數值。

8

LOCALTIME(precision)

可以選擇一個精度引數,這會導致結果舍入到秒欄位中的那麼多小數位。

9

LOCALTIMESTAMP(precision)

可以選擇一個精度引數,這會導致結果舍入到秒欄位中的那麼多小數位。

使用上表中函式的示例:

testdb=# SELECT CURRENT_TIME;
       timetz
--------------------
 08:01:34.656+05:30
(1 row)


testdb=# SELECT CURRENT_DATE;
    date
------------
 2013-05-05
(1 row)


testdb=# SELECT CURRENT_TIMESTAMP;
              now
-------------------------------
 2013-05-05 08:01:45.375+05:30
(1 row)


testdb=# SELECT CURRENT_TIMESTAMP(2);
         timestamptz
------------------------------
 2013-05-05 08:01:50.89+05:30
(1 row)


testdb=# SELECT LOCALTIMESTAMP;
       timestamp
------------------------
 2013-05-05 08:01:55.75
(1 row)

PostgreSQL 還提供返回當前語句的開始時間以及函式被呼叫時的實際當前時間的函式。這些函式是:

序號 函式 & 描述
1

transaction_timestamp()

它等效於 CURRENT_TIMESTAMP,但名稱清楚地反映了它返回的內容。

2

statement_timestamp()

它返回當前語句的開始時間。

3

clock_timestamp()

它返回實際的當前時間,因此即使在單個 SQL 命令中,其值也會發生變化。

4

timeofday()

它返回實際的當前時間,但作為格式化的文字字串而不是帶有時區的 timestamp 值。

5

now()

它是 transaction_timestamp() 的傳統 PostgreSQL 等效項。

DATE_PART(text, timestamp), DATE_PART(text, interval), DATE_TRUNC(text, timestamp)

序號 函式 & 描述
1

DATE_PART('field', source)

這些函式獲取子欄位。field 引數需要是一個字串值,而不是名稱。

有效的欄位名稱為:century, day, decade, dow, doy, epoch, hour, isodow, isoyear, microseconds, millennium, milliseconds, minute, month, quarter, second, timezone, timezone_hour, timezone_minute, week, year.

2

DATE_TRUNC('field', source)

此函式在概念上類似於數字的 trunc 函式。source 是型別為 timestamp 或 interval 的值表示式。field 選擇將輸入值截斷到哪個精度。返回值的型別為 timestampinterval

field 的有效值為:microseconds, milliseconds, second, minute, hour, day, week, month, quarter, year, decade, century, millennium

以下是 DATE_PART('field', source) 函式的示例:

testdb=# SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
 date_part
-----------
        16
(1 row)


testdb=# SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
 date_part
-----------
         4
(1 row)

以下是 DATE_TRUNC('field', source) 函式的示例:

testdb=# SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
     date_trunc
---------------------
 2001-02-16 20:00:00
(1 row)


testdb=# SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
     date_trunc
---------------------
 2001-01-01 00:00:00
(1 row)

EXTRACT(field from timestamp), EXTRACT(field from interval)

EXTRACT(field FROM source) 函式從日期/時間值中檢索子欄位,例如年份或小時。source 必須是型別為 timestamp, time, 或 interval 的值表示式。field 是一個識別符號或字串,用於選擇從源值中提取哪個欄位。EXTRACT 函式返回型別為 double precision 的值。

以下是有效的欄位名稱(類似於 DATE_PART 函式欄位名稱):century, day, decade, dow, doy, epoch, hour, isodow, isoyear, microseconds, millennium, milliseconds, minute, month, quarter, second, timezone, timezone_hour, timezone_minute, week, year。

以下是 EXTRACT('field', source) 函式的示例:

testdb=# SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');
 date_part
-----------
        20
(1 row)


testdb=# SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
 date_part
-----------
        16
(1 row)

ISFINITE(date), ISFINITE(timestamp), ISFINITE(interval)

序號 函式 & 描述
1

ISFINITE(date)

測試有限日期。

2

ISFINITE(timestamp)

測試有限時間戳。

3

ISFINITE(interval)

測試有限區間。

以下是 ISFINITE() 函式的示例:

testdb=# SELECT isfinite(date '2001-02-16');
 isfinite
----------
 t
(1 row)


testdb=# SELECT isfinite(timestamp '2001-02-16 21:28:30');
 isfinite
----------
 t
(1 row)


testdb=# SELECT isfinite(interval '4 hours');
 isfinite
----------
 t
(1 row)

JUSTIFY_DAYS(interval), JUSTIFY_HOURS(interval), JUSTIFY_INTERVAL(interval)

序號 函式 & 描述
1

JUSTIFY_DAYS(interval)

調整區間,使 30 天的時間段表示為月份。返回 interval 型別

2

JUSTIFY_HOURS(interval)

調整區間,使 24 小時的時間段表示為天。返回 interval 型別

3

JUSTIFY_INTERVAL(interval)

使用 JUSTIFY_DAYS 和 JUSTIFY_HOURS 調整區間,並進行額外的符號調整。返回 interval 型別

以下是 ISFINITE() 函式的示例:

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


testdb=# SELECT justify_hours(interval '27 hours');
 justify_hours
----------------
 1 day 03:00:00
(1 row)


testdb=# SELECT justify_interval(interval '1 mon -1 hour');
 justify_interval
------------------
 29 days 23:00:00
(1 row)
廣告