您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

4.8. 时间/日期函数和操作符

Table 4-17 显示了 PostgreSQL 里可以用于处理日期/时间数值的函数. Table 4-16 演示了基本算术操作符 ( + * 等等)的行为. 而与格式化相关的函数,可以参考 Section 4.7 . 你应该很熟悉日期/时间数据类型的背景知识( Section 3.5 ).

下面描述的日期/时间操作符的行为在有时区属性和没有时区属性的 类型上是相似的.

Table 4-16. 日期/时间操做符

名字 例子 结果
+ timestamp '2001-09-28 01:00' + interval '23 hours' timestamp '2001-09-29 00:00'
+ date '2001-09-28' + interval '1 hour' timestamp '2001-09-28 01:00'
+ time '01:00' + interval '3 hours' time '04:00'
- timestamp '2001-09-28 23:00' - interval '23 hours' timestamp '2001-09-28'
- date '2001-09-28' - interval '1 hour' timestamp '2001-09-27 23:00'
- time '05:00' - interval '2 hours' time '03:00'
- interval '2 hours' - time '05:00' time '03:00:00'
* interval '1 hour' * int '3' interval '03:00'
/ interval '1 hour' / int '3' interval '00:20'

Table 4-17. 日期/时间函数

函数 返回 描述 例子 结果
age ( timestamp ) interval 从现在减去得到的数值 age(timestamp '1957-06-13') 43 years 8 mons 3 days
age ( timestamp , timestamp ) interval 减去参数 age('2001-04-10', timestamp '1957-06-13') 43 years 9 mons 27 days
current_date date 今天的日期;见 下文    
current_time time 现在的时间;见 下文    
current_timestamp timestamp 日期和时间;见下文    
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+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 ( timestamp ) boolean 测试有穷时间戳(即非无效也非无穷) isfinite(timestamp '2001-02-16 21:28:30') true
isfinite ( interval ) boolean 测试有穷时间间格 isfinite(interval '4 hours') true
now () timestamp 当前的日期和时间(等效于 current_timestamp );见下文    
timeofday () text 当前日期和时间;见下文 timeofday() Wed Feb 21 17:01:13.000126 2001 EST
timestamp ( date ) timestamp 日期转换成 timestamp timestamp(date '2000-12-25') 2000-12-25 00:00:00
timestamp ( date , time ) timestamp 日期和时间转换成 timestamp timestamp(date '1998-02-24',time '23:07') 1998-02-24 23:07:00

4.8.1. EXTRACT date_part

EXTRACT (

field

 FROM 

source

)

extract 函数从日期/时间数值里抽取 子域,比如年或者小时等. source 是一个值表达式,可以计算出类型 timestamp 或者 interval .(类型为 date 或者 time 的表达式将转换为 timestamp 然后再处理.) field 是一个标识符 或者字串,它指定从源数据中抽取的数域. extract 函数返回类型为 double precision 的数值. 下列数值是有效数值∶

century

年份域除以100

SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

20

请注意,世纪数据域只是简单的年份域除以100,而不是传统的那样把 大多数19xx年放到二十世纪.

day

(月分)里的日期域(1-31)

SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

16

decade

年份域除以10

SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

200

dow

每周的星期号(0 - 6;星期天是 0) (仅用于 timestamp )

SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

5

doy

一年的第几天(1 -365/366) (仅用于 timestamp )

SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

47

epoch

对于 date timestamp 数值而言, 是自 1970-01-01 00:00:00 以来的秒数(结果可能是负数.); 对于 interval 数值而言,它是时间间隔的总秒数.

SELECT EXTRACT(EPOCH FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

982352320


SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');

Result: 

442800

hour

小时域 (0 - 23)

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

20

microseconds

秒域,包括小数部分,乘以 1,000,000.请注意它包括全部的秒.

SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');

Result: 

28500000

millennium

年域除以 1000

SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

2

请注意千年域只是简单的用 1000 除年域,而不是传统那样定义的 19xx 年是第二个千年.

milliseconds

秒域,包括小数部分,乘以 1000.请注意它包括完整的秒.

SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');

Result: 

28500

minute

分钟域 (0 - 59)

SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

38

month

对于 timestamp 数值,它是一年里的月份数(1 - 12); 对于 interval 数值,它是月的数目,然后对 12 取模(0 - 11)

SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

2


SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months');

Result: 

3


SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');

Result: 

1

quarter

该天所在的该年的季度(1 - 4)(仅用于 timestamp )

SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

1

second

秒域,包括小数部分 (0 - 59 [1] )

SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

40


SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');

Result: 

28.5

timezone_hour

时区偏移的小时部分.

timezone_minute

时区偏移的分钟部分.

week

从一个 timestamp 数值里计算该天在所在的年份里 是第几周.根据定义 ( ISO 8601),一年的 第一周包含该年的一月四日.( ISO 的周从星期一开始.) 换句话说,一年的第一个星期四在第一周.

SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

7

year

年份域

SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');

Result: 

2001

extract 函数主要的用途是做运算用. 对于用于显示的日期/时间数值格式化,参阅 Section 4.7

date_part 函数是在传统的 Ingres 函数的基础上制作的(该 函数等效于 SQL 函数 extract )∶

date_part('

field

', 

source

)

请注意这里的 field 数值必须是 一个字串.有效的 date_part 数域数值 和用于 extract 的是一样的.

SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');

Result: 

16


SELECT date_part('hour', INTERVAL '4 hours 3 minutes');

Result: 

4

4.8.2. date_trunc

date_trunc 函数在概念上和用于 数字的 trunc 函数类似.

date_trunc('

field

', 

source

)

source 是类型 timestamp 的值表达式(类型 date time 的数值都自动转换). 用 field 选择对该时间戳数值 选用什么样的精度进行截断). 返回的数值是 timestamp 类型,所有小于选定的 精度的域都设置为零(或者一,如果是日期和月份域的话).

field 的有效数值是∶

microseconds
milliseconds
second
minute
hour
day
month
year
decade
century
millennium

SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');

Result: 

2001-02-16 20:00:00+00


SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');

Result: 

2001-01-01 00:00:00+00

4.8.3. 当前日期/时间

我们可以使用下面的函数获取当前的日期和/或时间∶

CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME ( 

precision

 )
CURRENT_TIMESTAMP ( 

precision

 )

CURRENT_TIME CURRENT_TIMESTAMP 可以有选择地给予一个精度参数, 该精度导致结果园整为指定小数位.如果没有精度参数, 将给予所能得到的全部精度.

注意: PostgreSQL 7.2 之前没有实现精度参数, 结果总是给出整数的秒.

注意: SQL99 标准要求这些书写这些函数的时候不带 圆括弧,除非给出精度参数.对于 PostgreSQL 7.2, 你也可以写出一对空括弧,但是这样做是已经废弃了的做法,而且我们 在以后的版本可能删除它.

SELECT CURRENT_TIME;

14:39:53.662522-05


SELECT CURRENT_DATE;

2001-12-23


SELECT CURRENT_TIMESTAMP;

2001-12-23 14:39:53.662522-05


SELECT CURRENT_TIMESTAMP(2);

2001-12-23 14:39:53.66-05

函数 now() 是传统的 PostgreSQL CURRENT_TIMESTAMP 的等效物.

还有一个 timeofday() 函数,由于历史原因, 它返回一个字串,而不是 timestamp 值∶

SELECT timeofday();
 Sat Feb 17 19:07:32.000126 2001 EST

还有一件事提醒大家,那就是 CURRENT_TIMESTAMP 和相关的函数都把时间当做当前事务的开始返回;在事务运行的时候, 它们的数值并不增加.但 timeofday() 返回当前的实际时间.

所有日期/时间类型还接受特殊的文本值 now , 用于声明当前的日期和时间.因此,下面三个都返回相同的结果∶

SELECT CURRENT_TIMESTAMP;
SELECT now();
SELECT TIMESTAMP 'now';

注意: 在创建表声明一个 DEFAULT 值的时候你是不会想用第三种形式的. 因为系统将在分析这个常量的时候把 now 转换成 一个 timestamp ,因此在需要缺省值的时候, 就会使用创建表的时间! 而头两种形式要到实际使用缺省值的时候才计算, 因为它们是函数调用.因此它们可以给出插入时间行的时候 需要的缺省行为.

Notes

[1]

如果操作系统实现了润秒, 那么上限是 60