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