postgresql 日期 和 时间——迹忆客-ag捕鱼王app官网
我们在数据类型一章中讨论了日期/时间数据类型。现在,让我们看看日期/时间运算符和函数。
日期/时间操作符
下表演示了基本算术操作符的行为( ,*, 等):
操作符 | 例子 | 结果 |
---|---|---|
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)