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' (days)
- 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() 测试有限的日期、时间和间隔(不是 +/-无穷)
6 JUSTIFY() 调整间隔

AGE(timestamp, timestamp), AGE(timestamp)

序号 函数 描述
1 AGE(timestamp, timestamp) 当给函数传递第二个参数 TIMESTAMP 形式时,AGE() 减去参数,产生一个“符号”结果,该结果使用年和月并且类型为 INTERVAL。
2 AGE(timestamp) 当仅使用第一个 TIMESTAMP 作为参数调用时,AGE() 从 current_date(午夜)中减去。

函数 AGE(timestamp, timestamp) 的示例

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

上面给出的 PostgreSQL 语句将产生以下结果 -

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

函数 AGE(timestamp) 的示例

jiyik_db=# 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) 参数precision是可选的,这会导致结果四舍五入到秒字段中的小数位数。
5 CURRENT_TIMESTAMP(precision) 参数precision是可选的,这会导致结果四舍五入到秒字段中的小数位数。
6 LOCALTIME 返回无时区的时间。
7 LOCALTIMESTAMP 返回无时区的时间戳。
8 LOCALTIME(precision) 参数precision是可选的,这会导致结果四舍五入到秒字段中的小数位数。
9 LOCALTIMESTAMP(precision) 参数precision是可选的,这会导致结果四舍五入到秒字段中的小数位数。

使用上表中函数的示例

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

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

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

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

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

PostgreSQL 还提供了返回当前语句开始时间的函数,以及函数被调用瞬间的实际当前时间。

序号 函数 说明
1 transaction_timestamp() 当前事务开始时的时间
2 statement_timestamp() 实时时钟的当前时间
3 clock_timestamp() 实时时钟的当前时间戳(在语句执行时变化)
4 timeofday() 与clock_timestamp相同,但结果是一个text 字符串;
5 now() 当前事务开始时的时间戳;

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

序号 函数 说明
1 DATE_PART('field', source) 获取子域(等效于extract);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是时间戳或间隔类型的值表达式。field选择要截断输入值的精度。返回值的类型为timestamp或interval。field的有效值为:microseconds, milliseconds, second, minute, hour, day, week, month, quarter, year, decade, century, millennium

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

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

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

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

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

jiyik_db=# 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中提取的部分值,例如日期中的年或时间中的小时。

source 类型必须是一个时间戳,时间或间隔的值表达式。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) 函数的示例

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

jiyik_db=# 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() 函数的示例

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

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

jiyik_db=# 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() 函数的示例

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

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

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

查看笔记

扫码一下
查看教程更方便