PostgreSQL 日期/时间函数和运算符
我们在本章中讨论了日期/时间数据类型 数据类型 .现在,让我们看看日期/时间运算符和函数。
下表列出了基本算术运算符的行为:
Operator | 例子 | Result |
---|---|---|
+ | 日期 '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' |
+ | interval '1 day' + interval '1 hour' | interval '1 day 01:00:00' |
+ | 时间戳 '2001-09-28 01:00' + 间隔 '23 小时' | 时间戳 '2001-09-29 00:00:00' |
+ | 时间“01:00”+间隔“3小时” | 时间 '04:00:00' |
- | - 间隔“23 小时” | interval '-23:00:00' |
- | 日期'2001-10-01' - 日期'2001-09-28' | integer '3' (days) |
- | 日期 '2001-10-01' - 整数 '7' | 日期 '2001-09-24' |
- | 日期 '2001-09-28' - 间隔 '1 小时' | 时间戳 '2001-09-27 23:00:00' |
- | 时间 '05:00' - 时间 '03:00' | interval '02:00:00' |
- | 时间 '05:00' - 间隔 '2 小时' | 时间 '03:00:00' |
- | 时间戳 '2001-09-28 23:00' - 间隔 '23 小时' | 时间戳 '2001-09-28 00:00:00' |
- | interval '1 day' - interval '1 hour' | interval '1 day -01:00:00' |
- | 时间戳'2001-09-29 03:00' - 时间戳'2001-09-27 12:00' | interval '1 day 15:00:00' |
* | 900 *间隔'1秒' | interval '00- 间隔“23 小时”00' |
* | 21 * 间隔“1 天” | interval '21 days' |
* | 双精度 '3.5' * 间隔 '1 小时' | interval '03以下是所有可用的重要日期和时间相关功能的列表。00' |
/ | interval '1 hour' / double precision '1.5' | interval '00测试有限的日期、时间和间隔(不是 +/- 无穷大)00' |
以下是所有可用的重要日期和时间相关功能的列表。
序号 | 功能说明 |
---|---|
1 |
AGE()
减去参数 |
2 |
当前日期/时间()
当前日期和时间 |
3 |
DATE_PART()
获取子字段(相当于提取) |
4 |
提炼()
获取子字段 |
5 |
是有限的()
测试有限的日期、时间和间隔(不是 +/- 无穷大) |
6 |
JUSTIFY
调整间隔 |
年龄(时间戳,时间戳),年龄(时间戳)
序号 | 功能说明 |
---|---|
1 |
年龄(时间戳,时间戳) 当使用第二个参数的 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 提供了许多返回与当前日期和时间相关的值的函数。以下是一些功能:
序号 | 功能说明 |
---|---|
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 还提供了返回当前语句开始时间的函数,以及函数被调用瞬间的实际当前时间。这些功能是:
序号 | 功能说明 |
---|---|
1 |
交易时间戳() 它等同于 CURRENT_TIMESTAMP,但命名是为了清楚地反映它返回的内容。 |
2 |
statement_timestamp() 它返回当前语句的开始时间。 |
3 |
时钟时间戳() 它返回实际的当前时间,因此即使在单个 SQL 命令中它的值也会发生变化。 |
4 |
时间() 它返回实际的当前时间,但作为格式化的文本字符串而不是带有时区值的时间戳。 |
5 |
now() 它是传统的 PostgreSQL 等价于 transaction_timestamp()。 |
DATE_PART(文本,时间戳),DATE_PART(文本,间隔),DATE_TRUNC(文本,时间戳)
序号 | 功能说明 |
---|---|
1 |
DATE_PART('字段',来源) 这些函数获取子字段。这 field 参数必须是字符串值,而不是名称。 有效的字段名称是: 世纪、天、十年、道、道、纪元、小时、等度、等年、微秒、千禧年、毫秒、分钟、月、季度、秒、时区、timezone_hour、timezone_minute、周、年。 |
2 |
DATE_TRUNC('字段',来源) 这个函数在概念上类似于 trunc 数字函数。 source 是时间戳或间隔类型的值表达式。 field 选择要截断输入值的精度。返回值的类型 时间戳 or interval . 的有效值 field are : 微秒、毫秒、秒、分钟、小时、日、周、月、季度、年、十年、世纪、千年 |
以下是 DATE_PART( 'field' , 源码) 函数:
testdb=# SELECT date_part('day', TIMESTAMP '2001-02-16 20获取子字段40'); date_part ----------- 16 (1 row) testdb=# SELECT date_part('hour', INTERVAL '4 hours 3 minutes'); date_part ----------- 4 (1 row)
以下是 DATE_TRUNC( 'field' , 源码) 函数:
testdb=# SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20获取子字段40'); date_trunc --------------------- 2001-02-16 20:00:00 (1 row) testdb=# SELECT date_trunc('year', TIMESTAMP '2001-02-16 20获取子字段40'); date_trunc --------------------- 2001-01-01 00:00:00 (1 row)
EXTRACT(来自时间戳的字段),EXTRACT(来自间隔的字段)
提取(来自源的字段) 函数从日期/时间值中检索子字段,例如年或小时。这 source 必须是类型的值表达式 时间戳、时间或间隔 . field 是一个标识符或字符串,用于选择要从源值中提取的字段。 EXTRACT 函数返回类型的值 双精度 .
以下是有效的字段名称(类似于 DATE_PART 函数字段名称):世纪、日、十年、dow、doy、epoch、小时、isodow、isoyear、微秒、千禧年、毫秒、分钟、月、季度、秒、时区、timezone_hour , timezone_minute, 周, 年。
以下是 EXTRACT( 'field' , 源码) 函数:
testdb=# SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12时间 '05:00' - 时间 '03:00'13'); date_part ----------- 20 (1 row) testdb=# SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20获取子字段40'); date_part ----------- 16 (1 row)
ISFINITE(日期),ISFINITE(时间戳),ISFINITE(间隔)
序号 | 功能说明 |
---|---|
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 2121 * 间隔“1 天”30'); isfinite ---------- t (1 row) testdb=# SELECT isfinite(interval '4 hours'); isfinite ---------- t (1 row)
JUSTIFY_DAYS(间隔),JUSTIFY_HOURS(间隔),JUSTIFY_INTERVAL(间隔)
序号 | 功能说明 |
---|---|
1 |
JUSTIFY_DAYS(间隔) 调整间隔,使 30 天的时间段表示为月。返回 interval type |
2 |
JUSTIFY_HOURS(间隔) 调整间隔,使 24 小时时间段表示为天。返回 interval type |
3 |
JUSTIFY_INTERVAL(间隔) 使用 JUSTIFY_DAYS 和 JUSTIFY_HOURS 调整间隔,并进行额外的符号调整。返回 interval type |
以下是 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)