7、时间、日期函数和操作符
__ 日期/时间操作符__
操作符
描述
例子
date + integer → date
给日期加上天数
date ‘2001-09-28’ + 7 → 2001-10-05
date + interval → timestamp
为日期添加时间间隔
date ‘2001-09-28’ + interval ‘1 hour’ → 2001-09-28 01:00:00
date + time → timestamp
在日期中添加一天中的时间
date ‘2001-09-28’ + time ‘03:00’ → 2001-09-28 03:00:00
interval + interval → interval
添加时间间隔
interval ‘1 day’ + interval ‘1 hour’ → 1 day 01:00:00
timestamp + interval → timestamp
在时间戳中添加一个时间间隔
timestamp ‘2001-09-28 01:00’ + interval ‘23 hours’ → 2001-09-29 00:00:00
time + interval → time
为时间添加时间间隔
time ‘01:00’ + interval ‘3 hours’ → 04:00:00
- interval → interval
取否一个时间间隔 - interval ‘23 hours’ → -23:00:00
date - date → integer
减去日期,生成经过的天数
date ‘2001-10-01’ - date ‘2001-09-28’ → 3
date - integer → date
从日期中减去天数
date ‘2001-10-01’ - 7 → 2001-09-24
date - interval → timestamp
从日期中减去时间间隔
date ‘2001-09-28’ - interval ‘1 hour’ → 2001-09-27 23:00:00
time - time → interval
减去时间
time ‘05:00’ - time ‘03:00’ → 02:00:00
time - interval → time
从时间中减去时间间隔
time ‘05:00’ - interval ‘2 hours’ → 03:00:00
timestamp - interval → timestamp
从时间戳中减去时间间隔
timestamp ‘2001-09-28 23:00’ - interval ‘23 hours’ → 2001-09-28 00:00:00
interval - interval → interval
减去时间间隔
interval ‘1 day’ - interval ‘1 hour’ → 1 day -01:00:00
timestamp - timestamp → interval
减去时间戳(将24小时间隔转换为天,类似于justify_hours())
timestamp ‘2001-09-29 03:00’ - timestamp ‘2001-07-27 12:00’ → 63 days 15:00:00
interval * double precision → interval
将时间间隔乘以数量
interval ‘1 second’ * 900 → 00:15:00
interval ‘1 day’ * 21 → 21 days
interval ‘1 hour’ * 3.5 → 03:30:00
interval / double precision → interval
用时间间隔除以数量
interval ‘1 hour’ / 1.5 → 00:40:00
日期/时间函数
函数
描述
例子
age ( timestamp, timestamp ) → interval
减去参数,生成一个使用年和月,而不是只用日的“符号化”的结果
age(timestamp ‘2001-04-10’, timestamp ‘1957-06-13’) → 43 years 9 mons 27 days
age ( timestamp ) → interval
从 current_date 减去参数(在午夜)
age(timestamp ‘1957-06-13’) → 62 years 6 mons 10 days
clock_timestamp ( ) → timestamp with time zone
当前日期和时间(在语句执行期间变化);
clock_timestamp() → 2019-12-23 14:39:53.662522-05
current_date → date
当前日期;
current_date → 2019-12-23
current_time → time with time zone
一天中的当前时间;
current_time → 14:39:53.662522-05
current_time ( integer ) → time with time zone
一天中的当前时间;有限精度;
current_time(2) → 14:39:53.66-05
current_timestamp → timestamp with time zone
当前日期和时间 (当前事务的开始);
current_timestamp → 2019-12-23 14:39:53.662522-05
current_timestamp ( integer ) → timestamp with time zone
当前日期和时间 (当前事务的开始);有限精度;
current_timestamp(0) → 2019-12-23 14:39:53-05
date_part ( text, timestamp ) → double precision
获取时间戳字段 (等同于 extract);
date_part(‘hour’, timestamp ‘2001-02-16 20:38:40’) → 20
date_part ( text, interval ) → double precision
获取时间间隔子字段(等同于 extract);
date_part(‘month’, interval ‘2 years 3 months’) → 3
date_trunc ( text, timestamp ) → timestamp
截断到指定的精度;
date_trunc(‘hour’, timestamp ‘2001-02-16 20:38:40’) → 2001-02-16 20:00:00
date_trunc ( text, timestamp with time zone, text ) → timestamp with time zone
在规定的时区中截断到指定的精度;
date_trunc(‘day’, timestamptz ‘2001-02-16 20:38:40+00’, ‘Australia/Sydney’) → 2001-02-16 13:00:00+00
date_trunc ( text, interval ) → interval
截断到指定的精度;
date_trunc(‘hour’, interval ‘2 days 3 hours 40 minutes’) → 2 days 03:00:00
extract ( field from timestamp ) → double precision
获取时间戳子字段;
extract(hour from timestamp ‘2001-02-16 20:38:40’) → 20
extract ( field from interval ) → double precision
获取时间间隔子字段;
extract(month from interval ‘2 years 3 months’) → 3
isfinite ( date ) → boolean
测试有限日期(不是+/-无限)
isfinite(date ‘2001-02-16’) → true
isfinite ( timestamp ) → boolean
测试有限时间戳(不是+/-无限)
isfinite(timestamp ‘infinity’) → false
isfinite ( interval ) → boolean
测试有限时间间隔 (当前总是为真)
isfinite(interval ‘4 hours’) → true
justify_days ( interval ) → interval
调整间隔,使得30天时间周期表示为月
justify_days(interval ‘35 days’) → 1 mon 5 days
justify_hours ( interval ) → interval
调整时间间隔,使得24小时时间周期表示为日
justify_hours(interval ‘27 hours’) → 1 day 03:00:00
justify_interval ( interval ) → interval
使用 justify_days 和 justify_hours调整时间间隔; 通过额外的符号调整
justify_interval(interval ‘1 mon -1 hour’) → 29 days 23:00:00
localtime → time
一天中当前时间;
localtime → 14:39:53.662522
localtime ( integer ) → time
一天中的当前时间,有限精度;
localtime(0) → 14:39:53
localtimestamp → timestamp
当前日期和时间(当前事务的开始);
localtimestamp → 2019-12-23 14:39:53.662522
localtimestamp ( integer ) → timestamp
当前日期和时间(当前事务的开始);
localtimestamp(2) → 2019-12-23 14:39:53.66
make_date ( year int, month int, day int ) → date
从年、月和日字段创建日期
make_date(2013, 7, 15) → 2013-07-15
make_interval ( [ years int [, months int [, weeks int [, days int [, hours int [, mins int [, secs double precision ]]]]]]] ) → interval
从年、月、周、日、小时、分钟和秒字段创建时间间隔,每个字段默认为0
make_interval(days => 10) → 10 days
make_time ( hour int, min int, sec double precision ) → time
从小时、分钟和秒字段创建时间
make_time(8, 15, 23.5) → 08:15:23.5
make_timestamp ( year int, month int, day int, hour int, min int, sec double precision ) → timestamp
从年、月、日、小时、分钟和秒字段创建时间戳
make_timestamp(2013, 7, 15, 8, 15, 23.5) → 2013-07-15 08:15:23.5
make_timestamptz ( year int, month int, day int, hour int, min int, sec double precision [, timezone text ] ) → timestamp with time zone
从年,月,日,小时,分钟和秒字段结合时区创建时间戳;如果没有指定timezone,则使用当前时区
make_timestamptz(2013, 7, 15, 8, 15, 23.5) → 2013-07-15 08:15:23.5+01
now ( ) → timestamp with time zone
当前日期和时间(当前事务的开始);
now() → 2019-12-23 14:39:53.662522-05
statement_timestamp ( ) → timestamp with time zone
当前日期和时间(当前语句的开始);
statement_timestamp() → 2019-12-23 14:39:53.662522-05
timeofday ( ) → text
当前的日期和时间 (类似 clock_timestamp, 但是采用 text 字符串);
timeofday() → Mon Dec 23 14:39:53.662522 2019 EST
transaction_timestamp ( ) → timestamp with time zone
当前日期和时间(当前事务的开始);
transaction_timestamp() → 2019-12-23 14:39:53.662522-05
to_timestamp ( double precision ) → timestamp with time zone
将Unix纪元转换为带时区的时间戳(从1970-01-01 00:00:00+00开的的秒)
to_timestamp(1284352323) → 2010-09-13 04:32:03+00
8、延时执行
下面的这些函数可以用于让服务器进程延时执行:
pg_sleep ( double precision )
pg_sleep_for ( interval )
pg_sleep_until ( timestamp with time zone )
pg_sleep使当前会话的进程休眠,直到过去给定的秒数。可以指定几分之一秒的延迟。
pg_sleep_for是一个方便的函数,允许将睡眠时间指定为时间间隔。 pg_sleep_until是一个方便的函数,用于需要特定的唤醒时间。例如:
SELECT pg_sleep(1.5);
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00');
9、枚举支持函数
函数
描述
例子
enum_first ( anyenum ) → anyenum
返回输入枚举类型的第一个值。
enum_first(null::rainbow) → red
enum_last ( anyenum ) → anyenum
返回输入枚举类型的最后一个值。
enum_last(null::rainbow) → purple
enum_range ( anyenum ) → anyarray
将输入枚举类型的所有值作为一个有序的数组返回。
enum_range(null::rainbow) → {red,orange,yellow,green,blue,purple}
enum_range ( anyenum, anyenum ) → anyarray
以一个数组返回在给定两个枚举值之间的范围。值必须来自相同的枚举类型。 如果第一个参数为空,其结果将从枚举类型的第一个值开始。如果第二参数为空,其结果将以枚举类型的最后一个值结束。
enum_range(‘orange’::rainbow, ‘green’::rainbow) → {orange,yellow,green}
enum_range(NULL, ‘green’::rainbow) → {red,orange,yellow,green}
enum_range(‘orange’::rainbow, NULL) → {orange,yellow,green,blue,purple}