PostgreSQL的date_part/extract函数

PostgreSQL可以使用datepart/Extract从日期时间类型中抽取部分内容,帮助内容如下:

EXTRACT(fieldFROMsource)

extract函数从日期/时间数值里抽取子域,比如年、小时等。 source必须是一个 typetimestamp,time,interval类型的值 表达式(类型为date的表达式将转换为timestamp,因此也可以用)。field是一个标识符或者字符串,它指定从源数据中抽取的域。 extract函数返回类型为 double precision 的数值。下列数值是有效数据域的名字:

century

世纪

SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');
Result:20
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');
Result:21

第一个世纪从 0001-01-01 00:00:00 AD 开始,尽管那时候人们还不知道 这是第一个世纪。这个定义适用于所有使用阳历的国家。没有 0 世纪, 我们直接从公元前 1 世纪到公元 1 世纪。 如果你认为这个不合理,那么请把抱怨发给:梵蒂冈,罗马圣彼得教堂,教皇收

PostgreSQL8.0 以前版本里并不遵循世纪的习惯编号,只是把年份除以 100 。

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)

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

请注意,extract的周中天编号和to_char(…, ‘D’)函数不同。

doy

一年的第几天(1-365/366)

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

epoch

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

SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08');
结果:982384720.12

SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
结果:442800

下面是把 epoch 值转换回时间戳的方法:

SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second';

(Theto_timestampfunction encapsulates the above conversion.)

hour

The hour field (0 – 23)小时域(0-23)

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

isodow

周中的第几天 [1-7] 星期一:1) 星期天:(7)。

SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40');
结果:7

dow除了星期天外,都相同。这与ISO8601标准周中的第几天编码相匹配。 matches theISO8601 day of the week numbering.

isoyear

日期中的ISO8601标准年(不适用于间隔)。

SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01');
结果:2005
SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02');
结果:2006

每个带有星期一开始的周中包含1月4日的ISO年, 所以在年初的1月或12月下旬的ISO年可能会不同与阳历的年。 见week获取更多信息。

这个域不能用于 PostgreSQL 8.3之前的版本。

microseconds

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

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

millennium

千年

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

20 世纪(19xx 年)里面的年份在第二个千年里。第三个千年从 2001 年 1 月 1 日零时开始。

PostgreSQL8.0 之前的版本并不遵循千年编号的习惯,只是返回年份除以 1000 。

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

Fortimestampvalues, the number of the month within the year (1 – 12) ; forintervalvalues the number of months, modulo 12 (0 – 11) 对于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

与UTC的时区偏移量,以秒记。正数对应 UTC 东边的时区,负数对应 UTC 西边的时区

timezone_hour

时区偏移量的小时部分。

timezone_minute

时区偏移量的分钟部分。

week

该天在所在的年份里是第几周。 (ISO8601)定义一年的第一周包含该年的一月四日(ISO-8601 的周从星期一开始)。 换句话说,一年的第一个星期四在第一周。(只用于 timestamp 值)

因此,一月的头几天可能是前一年的第 52 或者第 53 周。 比如,2005-01-01是 2004 年的第 53 周,而2006-01-01是 2005 年的第 52 周

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

year

年份域。要记住这里没有0 AD,所以从AD年里抽取BC年应该小心些

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

extract函数主要的用途是运算。对于用于显示的日期/时间数值格式化,见Section 9.8

date_part函数是仿照在传统的Ingres函数。等效于 SQL 标准函数extract:

date_part('field',source)

Note that here thefieldparameter needs to be a string value, not a name. The valid field names for date_partare the same as for extract. 请注意这里的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
分享到: