我们在数据类型一章中讨论了日期/时间数据类型.现在,让我们看一下日期/时间运算符和函数.
下表列出了基本算术运算符的行为 :
运算符 | 示例 | 结果 |
---|---|---|
+ | 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.不. | 功能&描述 |
---|---|
1 | AGE() 减去参数 |
2 | 当前日期/时间() 当前日期和时间 |
3 | DATE_PART() 获取子字段(相当于提取) |
4 | EXTRACT() 获取子字段 |
5 | ISFINITE() 测试有限日期,时间和间隔(非+/-无穷大) |
6 | JUSTIFY 调整间隔 |
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
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(). |
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(字段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)
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)
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)