PostgreSQL - 日期/时间函数和运算符


我们在数据类型一章中讨论了日期/时间数据类型。现在,让我们看看日期/时间运算符和函数。

下表列出了基本算术运算符的Behave -

操作员 例子 结果
+ 日期 '2001-09-28' + 整数 '7' 日期 '2001-10-05'
+ 日期 '2001-09-28' + 间隔 '1 小时' 时间戳 '2001-09-28 01:00:00'
+ 日期 '2001-09-28' + 时间 '03:00' 时间戳 '2001-09-28 03:00:00'
+ 间隔“1 天”+ 间隔“1 小时” 间隔 '1 天 01:00:00'
+ 时间戳 '2001-09-28 01:00' + 间隔 '23 小时' 时间戳 '2001-09-29 00:00:00'
+ 时间“01:00”+间隔“3小时” 时间 '04:00:00'
- - 间隔“23小时” 间隔'-23:00:00'
- 日期 '2001-10-01' - 日期 '2001-09-28' 整数“3”(天)
- 日期 '2001-10-01' - 整数 '7' 日期 '2001-09-24'
- 日期 '2001-09-28' - 间隔 '1 小时' 时间戳 '2001-09-27 23:00:00'
- 时间“05:00”-时间“03:00” 间隔“02:00:00”
- 时间 '05:00' - 间隔 '2 小时' 时间 '03:00:00'
- 时间戳 '2001-09-28 23:00' - 间隔 '23 小时' 时间戳 '2001-09-28 00:00:00'
- 间隔“1 天”- 间隔“1 小时” 间隔'1天-01:00:00'
- 时间戳 '2001-09-29 03:00' - 时间戳 '2001-09-27 12:00' 间隔'1天15:00:00'
* 900 * 间隔'1秒' 间隔“00:15:00”
* 21 * 间隔'1天' 间隔“21天”
* 双精度 '3.5' * 间隔 '1 小时' 间隔“03:30:00”
/ 间隔'1小时'/双精度'1.5' 间隔“00:40:00”

以下是所有重要的日期和时间相关可用功能的列表。

S. 编号 功能说明
1 年龄()

减去参数

2 当前日期/时间()

当前日期和时间

3 日期部分()

获取子字段(相当于提取)

4 提炼()

获取子字段

5 ISFINITE()

测试有限日期、时间和间隔(不是+/-无穷大)

6 证明合法

调整间隔

AGE(时间戳, 时间戳), AGE(时间戳)

S. 编号 功能说明
1

AGE(时间戳,时间戳)

当使用第二个参数的 TIMESTAMP 形式调用时,AGE() 减去参数,生成使用年和月且类型为 INTERVAL 的“符号”结果。

2

年龄(时间戳)

当仅使用 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

当前日期/时间()

PostgreSQL 提供了许多返回与当前日期和时间相关的值的函数。以下是一些功能 -

S. 编号 功能说明
1

当前日期

提供当前日期。

2

当前时间

提供带有时区的值。

3

CURRENT_TIMESTAMP

提供带有时区的值。

4

CURRENT_TIME(精度)

可以选择采用精度参数,这会导致结果四舍五入到秒字段中的小数位数。

5

CURRENT_TIMESTAMP(精度)

可以选择采用精度参数,这会导致结果四舍五入到秒字段中的小数位数。

6

当地时间

提供无时区的价值。

7

本地时间戳

提供无时区的价值。

8

当地时间(精确)

可以选择采用精度参数,这会导致结果四舍五入到秒字段中的小数位数。

9

本地时间戳(精度)

可以选择采用精度参数,这会导致结果四舍五入到秒字段中的小数位数。

使用上表中的函数的示例 -

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 还提供了返回当前语句的开始时间以及调用该函数时的实际当前时间的函数。这些功能是 -

S. 编号 功能说明
1

transaction_timestamp()

它相当于 CURRENT_TIMESTAMP,但命名是为了清楚地反映它返回的内容。

2

语句_时间戳()

它返回当前语句的开始时间。

3

时钟时间戳()

它返回实际的当前时间,因此即使在单个 SQL 命令内,其值也会发生变化。

4

一天中的时间()

它返回实际的当前时间,但作为格式化文本字符串而不是带有时区值的时间戳。

5

现在()

它是传统的 PostgreSQL,相当于 transaction_timestamp()。

DATE_PART(文本,时间戳),DATE_PART(文本,间隔),DATE_TRUNC(文本,时间戳)

S. 编号 功能说明
1

DATE_PART('字段', 来源)

这些函数获取子字段。字段参数必须是字符串值,不是名称。

有效的字段名称为:世纪、日、十年、dow、doy、纪元、小时、isodow、isoyear、微秒、千年、毫秒、分钟、月份、季度、秒、时区、timezone_hour、timezone_month、week、year。

2

DATE_TRUNC('字段', 来源)

此函数在概念上类似于数字的trunc函数。source是时间戳或间隔类型的值表达式。字段选择截断输入值的精度。返回值的类型为时间戳间隔

字段的有效值为:微秒、毫秒、秒、分、小时、日、周、月、季度、年、十年、世纪、千年

以下是 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(来自时间戳的字段)、EXTRACT(来自间隔的字段)

EXTRACT (field FROM source)函数从日期/时间值中检索子字段,例如年或小时。源必须是时间戳时间或间隔类型的值表达式。该字段是一个标识符或字符串,用于选择从源值中提取哪个字段。EXTRACT 函数返回双精度类型的值。

以下是有效的字段名称(类似于 DATE_PART 函数字段名称): century、day、decade、dow、doy、epoch、hour、isodow、isoyear、microseconds、millennium、milliseconds、min、month、quarter、second、timezone、timezone_hour 、时区_分钟、周、年。

以下是 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(日期)、ISFINITE(时间戳)、ISFINITE(间隔)

S. 编号 功能说明
1

无限(日期)

测试有限日期。

2

ISFINITE(时间戳)

测试有限时间戳。

3

ISFINITE(区间)

有限间隔测试。

以下是 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(间隔)、JUSTIFY_HOURS(间隔)、JUSTIFY_INTERVAL(间隔)

S. 编号 功能说明
1

JUSTIFY_DAYS(间隔)

调整间隔,以便 30 天的时间段以月表示。返回区间类型

2

JUSTIFY_HOURS(间隔)

调整间隔,以便 24 小时时间段以天表示。返回区间类型

3

JUSTIFY_INTERVAL(间隔)

使用 JUSTIFY_DAYS 和 JUSTIFY_HOURS 调整间隔,并进行额外的符号调整。返回区间类型

以下是 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)