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

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

下表列出了基本算术运算符的行为 :

运算符示例结果
+date '2001-09-28'+整数'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'
+时间'01:00'+间隔'3小时'time '04:00:00'
-- 间隔'23小时'interval'-23:00:00'
-date'2001-10-01' -  date'2001-09-28'整数'3'(天)
-date'2001-10-01' - 整数'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天'
*双精度'3.5'*间隔'1小时'interval '03:30:00'
/interval' 1小时'/双精度'1.5'interval '00:40:00'

以下是可用的所有重要日期和时间相关函数的列表.

S.不.功能&描述
1AGE()

减去参数

2当前日期/时间()

当前日期和时间

3DATE_PART()

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

4EXTRACT()

获取子字段

5ISFINITE()

测试有限日期,时间和间隔(非+/-无穷大)

6JUSTIFY

调整间隔

 

AGE(timestamp, timestamp), AGE(timestamp)

S.不.功能&描述
1

AGE(时间戳,时间戳)

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

2

AGE(时间戳)

当仅使用TIMESTAMP作为参数调用,AGE()从current_date减去(在午夜).

函数示例AGE(时间戳,时间戳)是 :

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

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

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

函数示例AGE(时间戳)是 :

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

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

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

 

CURRENT DATE/TIME()

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

S.不.功能&描述
1

CURRENT_DATE

提供当前日期.

2

CURRENT_TIME

提供带时区的值.

3

CURRENT_TIMESTAMP

提供值时区.

4

CURRENT_TIME(精度)

可选择采用精度参数,这会导致结果舍入到秒字段中的许多小数位.

5

CURRENT_TIMESTAMP(精度)

可选择采用精度参数,其中c ause将结果舍入到秒字段中的那么多小数位.

6

LOCALTIME

无需时间即可提供价值区.

7

LOCALTIMESTAMP

提供没有时区的值.

8

LOCALTIME(精度)

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

9

LOCALTIMESTAMP(精度)

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

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

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

statement_timestamp()

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

3

clock_timestamp()

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

4

timeofday()

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

5

now()

这是一个传统的PostgreSQL等同于transaction_timestamp().

 

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

S.不.功能&描述
1

DATE_PART('field',source)

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

有效字段名称为:世纪,日,十年,道琼斯,doy ,纪元,小时,isodow,isoyear,微秒,千年,毫秒,分钟,月,季度,秒,时区,timezone_hour,timezone_minute,周,年.

2

DATE_TRUNC('field',source)

此函数在概念上类似于数字的 trunc 函数. source 是timestamp或interval类型的值表达式. field 选择截断输入值的精度.返回值的类型为 timestamp interval .

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

以下是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(字段FROM源)函数从日期/时间值中检索年份或小时等子字段. source 必须是时间戳,时间或间隔的值表达式. 字段是一个标识符或字符串,用于选择要从源值中提取的字段. 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(日期),ISFINITE(时间戳),ISFINITE(间隔)

S.不.功能&描述
1

ISFINITE(日期)

测试有限日期.

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(interval),JUSTIFY_HOURS(interval),JUSTIFY_INTERVAL(interval)

S.不.功能&描述
1

JUSTIFY_DAYS(interval)

调整间隔,以便将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)