- PostgreSQL 教程
- PostgreSQL - 首页
- PostgreSQL - 概述
- PostgreSQL - 环境设置
- PostgreSQL - 语法
- PostgreSQL - 数据类型
- PostgreSQL - 创建数据库
- PostgreSQL - 选择数据库
- PostgreSQL - 删除数据库
- PostgreSQL - 创建表
- PostgreSQL - 删除表
- PostgreSQL - 模式
- PostgreSQL - 插入查询
- PostgreSQL - 选择查询
- PostgreSQL - 运算符
- PostgreSQL - 表达式
- PostgreSQL - WHERE 子句
- PostgreSQL - AND & OR 子句
- PostgreSQL - 更新查询
- PostgreSQL - 删除查询
- PostgreSQL - LIKE 子句
- PostgreSQL - LIMIT 子句
- PostgreSQL - ORDER BY 子句
- PostgreSQL - GROUP BY
- PostgreSQL - WITH 子句
- PostgreSQL - HAVING 子句
- PostgreSQL - DISTINCT 关键字
- 高级 PostgreSQL
- PostgreSQL - 约束
- PostgreSQL - 连接
- PostgreSQL - UNION 子句
- PostgreSQL - NULL 值
- PostgreSQL - 别名语法
- PostgreSQL - 触发器
- PostgreSQL - 索引
- PostgreSQL - ALTER TABLE 命令
- TRUNCATE TABLE 命令
- PostgreSQL - 视图
- PostgreSQL - 事务
- PostgreSQL - 锁
- PostgreSQL - 子查询
- PostgreSQL - 自动递增
- PostgreSQL - 权限
- 日期/时间函数 & 运算符
- PostgreSQL - 函数
- PostgreSQL - 有用函数
- PostgreSQL 接口
- PostgreSQL - C/C++
- PostgreSQL - Java
- PostgreSQL - PHP
- PostgreSQL - Perl
- PostgreSQL - Python
- PostgreSQL 有用资源
- PostgreSQL - 快速指南
- PostgreSQL - 有用资源
- PostgreSQL - 讨论
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 选择将输入值截断到哪个精度。返回值的类型为 timestamp 或 interval。 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)