?
This document uses PHP Chinese website manual Release
Table 9-27顯示了 PostgreSQL 里可以用于處理日期/時(shí)間數(shù)值的函數(shù), 隨后一節(jié)里描述了細(xì)節(jié)。表Table 9-26演示了基本算術(shù)操作符的行為。(+, *, 等)。而與格式化相關(guān)的函數(shù),可以參考Section 9.8。 你應(yīng)該很熟悉Section 8.5的日期/時(shí)間數(shù)據(jù)類型的背景知識(shí)。
所有下述函數(shù)和操作符接收的time或timestamp輸入實(shí)際上都來(lái)自兩種可能: 一種是接收time with time zoneortimestamp with time zone, 另外一種是接收time without time zone或timestamp without time zone。 出于簡(jiǎn)化考慮,這些變種沒(méi)有獨(dú)立顯示出來(lái)。還有,+和*操作符都是以可交換的操作符對(duì)(比如, date + integer 和 integer + date);我們只顯示了這樣的交換操作符對(duì)中的一個(gè)。
Table 9-26. 日期/時(shí)間操作符
操作符 | 示例 | 結(jié)果 |
---|---|---|
+ | date '2001-09-28' + integer '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' |
+ | time '01:00' + interval '3 hours' | time '04:00:00' |
- | - interval '23 hours' | interval '-23:00:00' |
- | date '2001-10-01' - date '2001-09-28' | integer '3'(days) |
- | date '2001-10-01' - integer '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 days' |
* | double precision '3.5' * interval '1 hour' | interval '03:30:00' |
/ | interval '1 hour' / double precision '1.5' | interval '00:40:00' |
Table 9-27. 日期/時(shí)間函數(shù)
函數(shù) | 返回類型 | 描述 | 示例 | 結(jié)果 |
---|---|---|---|---|
age(timestamp,timestamp) |
interval | 參數(shù)相減, 返回一個(gè)使用年數(shù)和月份數(shù)的"符號(hào)"表示的結(jié)果 | age(timestamp '2001-04-10', timestamp '1957-06-13') | 43 years 9 mons 27 days |
age(timestamp) |
interval | 從current_date (午夜)減去參數(shù)后的結(jié)果 |
age(timestamp '1957-06-13') | 43 years 8 mons 3 days |
clock_timestamp() |
timestamp with time zone | 實(shí)時(shí)時(shí)鐘的當(dāng)前時(shí)間戳(在語(yǔ)句執(zhí)行中值會(huì)改變);見Section 9.9.4。 | ? | ? |
current_date |
date | 當(dāng)前日期;見Section 9.9.4 | ? | ? |
current_time |
time with time zone | 當(dāng)前時(shí)間;見Section 9.9.4 | ? | ? |
current_timestamp |
timestamp with time zone | 當(dāng)前事務(wù)開始時(shí)的時(shí)間戳;見Section 9.9.4 | ? | ? |
date_part(text,timestamp) |
double precision | 獲取子域(等效于extract );見Section 9.9.1
|
date_part('hour', timestamp '2001-02-16 20:38:40') | 20 |
date_part(text,interval) |
double precision | 獲取子域(等效于extract );見Section 9.9.1
|
date_part('month', interval '2 years 3 months') | 3 |
date_trunc(text,timestamp) |
timestamp | 截?cái)喑芍付ǖ木?;見Section 9.9.2 | date_trunc('hour', timestamp '2001-02-16 20:38:40') | 2001-02-16 20:00:00 |
extract (fieldfrom
timestamp) |
double precision | 獲取子域;見Section 9.9.1 | extract(hour from timestamp '2001-02-16 20:38:40') | 20 |
extract (fieldfrom
interval) |
double precision | 獲取子域;又見 seeSection 9.9.1 | extract(month from interval '2 years 3 months') | 3 |
isfinite(date) |
boolean | 測(cè)試是否為有窮日期 | isfinite(date '2001-02-16') | true |
isfinite(timestamp) |
boolean | 測(cè)試是否為有窮時(shí)間戳 | isfinite(timestamp '2001-02-16 21:28:30') | true |
isfinite(interval) |
boolean | 測(cè)試是否為有窮時(shí)間間隔 | isfinite(interval '4 hours') | true |
justify_days(interval) |
interval | 按照每月 30 天計(jì)算時(shí)間間隔 | justify_days(interval '35 days') | 1 mon 5 days |
justify_hours(interval) |
interval | 按照每天 24 小時(shí)計(jì)算時(shí)間間隔 | justify_hours(interval '27 hours') | 1 day 03:00:00 |
justify_interval(interval) |
interval | 用justify_days 和justify_hours 計(jì)算時(shí)間間隔的,加上相應(yīng)的正負(fù)號(hào)。
|
justify_interval(interval '1 mon -1 hour') | 29 days 23:00:00 |
localtime |
time | 當(dāng)前時(shí)間;見Section 9.9.4 | ? | ? |
localtimestamp |
timestamp | 當(dāng)前事務(wù)開始時(shí)的時(shí)間戳;見Section 9.9.4 | ? | ? |
now() |
timestamp with time zone | 當(dāng)前事務(wù)開始時(shí)的時(shí)間戳;見Section 9.9.4 | ? | ? |
statement_timestamp() |
timestamp with time zone | 當(dāng)前語(yǔ)句開始的時(shí)間戳;見Section 9.9.4 | ? | ? |
timeofday() |
text | 當(dāng)前日期時(shí)間,與clock_timestamp 相同,但結(jié)果是一個(gè)text字符串;見Section 9.9.4。
|
? | ? |
transaction_timestamp() |
timestamp with time zone | 當(dāng)前事務(wù)開始時(shí)的時(shí)間戳;見Section 9.9.4 | ? | ? |
除了這些函數(shù)以外,還支持 SQL 的 OVERLAPS 操作符:
(start1,end1) OVERLAPS (start2,end2) (start1,length1) OVERLAPS (start2,length2)
這個(gè)表達(dá)式在兩個(gè)時(shí)間域(用它們的終點(diǎn)定義)重疊的時(shí)候生成真值,否則為假。 終點(diǎn)可以用一對(duì)日期、時(shí)間、時(shí)間戳來(lái)聲明;或者是一個(gè)后面跟著時(shí)間間隔的日期、時(shí)間、時(shí)間戳。 當(dāng)提供一對(duì)值,不管先寫開始還是結(jié)束;OVERLAPS自動(dòng)將這對(duì)值較早的作為開始。 每段時(shí)間取值為半開區(qū)間開始<=時(shí)間<結(jié)束, 除非開始和結(jié)束相等,表示單一的時(shí)刻。這意味著兩個(gè)時(shí)間段只有一個(gè)共同的端點(diǎn)沒(méi)有重疊。
SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS (DATE '2001-10-30', DATE '2002-10-30'); Result:true SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS (DATE '2001-10-30', DATE '2002-10-30'); Result:false SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS (DATE '2001-10-30', DATE '2001-10-31'); Result:false SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS (DATE '2001-10-30', DATE '2001-10-31'); Result:true
當(dāng)把interval值添加到timestamp with time zone上(或從中減去)的時(shí)候, days 部分會(huì)按照指定的天數(shù)增加(或減少)timestamp with time zone的日期。 對(duì)于橫跨夏令時(shí)的變化(會(huì)話的時(shí)區(qū)設(shè)置被識(shí)別為夏時(shí)制),interval '1 day'并 不一定等于interval '24 hours'。例如,當(dāng)會(huì)話的時(shí)區(qū)設(shè)置為CST7CDT的時(shí)候, timestamp with time zone '2005-04-02 12:00-07' + interval '1 day' 的結(jié)果 是 timestamp with time zone '2005-04-03 12:00-06' ,而 將interval '24 hours'增加到相同的timestamp with time zone之上的結(jié)果 則是timestamp with time zone '2005-04-03 12:00-06', 因?yàn)?tt class="LITERAL">CST7CDT時(shí)區(qū)在2005-04-03 02:00的時(shí)候有一個(gè)夏令時(shí)變更。
注意age
返回的月數(shù)可能有歧義,因?yàn)椴煌脑路萦胁煌奶鞌?shù)。
PostgreSQL的方法是當(dāng)計(jì)算部分月數(shù)時(shí),采用兩個(gè)日期較早的月。例如:age('2004-06-01', '2004-04-30')
使用4月份產(chǎn)生1 mon 1 day,當(dāng)用5月分時(shí)產(chǎn)生1 mon 2 days,因?yàn)?月有31天,而4月只有30天。
EXTRACT
,date_part
EXTRACT(fieldFROMsource)
extract
函數(shù)從日期/時(shí)間數(shù)值里抽取子域,比如年、小時(shí)等。
source必須是一個(gè) typetimestamp,time,interval類型的值
表達(dá)式(類型為date的表達(dá)式將轉(zhuǎn)換為timestamp,因此也可以用)。
field是一個(gè)標(biāo)識(shí)符或者字符串,它指定從源數(shù)據(jù)中抽取的域。
extract
函數(shù)返回類型為 double precision 的數(shù)值。下列數(shù)值是有效數(shù)據(jù)域的名字:
世紀(jì)
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
第一個(gè)世紀(jì)從 0001-01-01 00:00:00 AD 開始,盡管那時(shí)候人們還不知道 這是第一個(gè)世紀(jì)。這個(gè)定義適用于所有使用陽(yáng)歷的國(guó)家。沒(méi)有 0 世紀(jì), 我們直接從公元前 1 世紀(jì)到公元 1 世紀(jì)。 如果你認(rèn)為這個(gè)不合理,那么請(qǐng)把抱怨發(fā)給:梵蒂岡,羅馬圣彼得教堂,教皇收
PostgreSQL8.0 以前版本里并不遵循世紀(jì)的習(xí)慣編號(hào),只是把年份除以 100 。
(月份)里的天(1-31)
SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); Result:16
年份除以 10
SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); Result:200
周中天的索引(0-6 ;星期天是 0)
SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); Result:5
請(qǐng)注意,extract
的周中天編號(hào)和to_char(..., 'D')
函數(shù)不同。
一年的第幾天(1-365/366)
SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); Result:47
對(duì)于date和timestamp值而言,是自 1970-01-01 00:00:00-00 以來(lái)的秒數(shù) (結(jié)果可能是負(fù)數(shù));對(duì)于interval值而言,它是時(shí)間間隔的總秒數(shù)。
SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); 結(jié)果:982384720.12 SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); 結(jié)果:442800
下面是把 epoch 值轉(zhuǎn)換回時(shí)間戳的方法:
SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second';
(Theto_timestamp
function encapsulates the above
conversion.)
The hour field (0 - 23)小時(shí)域(0-23)
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); 結(jié)果:20
周中的第幾天 [1-7] 星期一:1) 星期天:(7)。
SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); 結(jié)果:7
dow除了星期天外,都相同。這與ISO8601標(biāo)準(zhǔn)周中的第幾天編碼相匹配。 matches theISO8601 day of the week numbering.
日期中的ISO8601標(biāo)準(zhǔn)年(不適用于間隔)。
SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); 結(jié)果:2005 SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); 結(jié)果:2006
每個(gè)帶有星期一開始的周中包含1月4日的ISO年, 所以在年初的1月或12月下旬的ISO年可能會(huì)不同與陽(yáng)歷的年。 見week獲取更多信息。
這個(gè)域不能用于 PostgreSQL 8.3之前的版本。
秒域(包括小數(shù)部分)乘以 1,000,000 。請(qǐng)注意它包括全部的秒。
SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); 結(jié)果:28500000
千年
SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); 結(jié)果:3
20 世紀(jì)(19xx 年)里面的年份在第二個(gè)千年里。第三個(gè)千年從 2001 年 1 月 1 日零時(shí)開始。
PostgreSQL8.0 之前的版本并不遵循千年編號(hào)的習(xí)慣,只是返回年份除以 1000 。
秒域(包括小數(shù)部分)乘以 1000 。請(qǐng)注意它包括完整的秒。
SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); Result:28500
分鐘域(0-59)
SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); Result:38
Fortimestampvalues, the number of the month within the year (1 - 12) ; forintervalvalues the number of months, modulo 12 (0 - 11) 對(duì)于timestamp值,它是一年里的月份數(shù)(1-12); 對(duì)于interval值,它是月的編號(hào),然后對(duì) 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
日期中年所在季度(1-4)(僅用于 timestamp 值)
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); Result:1
秒域,包括小數(shù)部分(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
與UTC的時(shí)區(qū)偏移量,以秒記。正數(shù)對(duì)應(yīng) UTC 東邊的時(shí)區(qū),負(fù)數(shù)對(duì)應(yīng) UTC 西邊的時(shí)區(qū)
時(shí)區(qū)偏移量的小時(shí)部分。
時(shí)區(qū)偏移量的分鐘部分。
該天在所在的年份里是第幾周。 (ISO8601)定義一年的第一周包含該年的一月四日(ISO-8601 的周從星期一開始)。 換句話說(shuō),一年的第一個(gè)星期四在第一周。(只用于 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
年份域。要記住這里沒(méi)有0 AD,所以從AD年里抽取BC年應(yīng)該小心些
SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); Result:2001
extract
函數(shù)主要的用途是運(yùn)算。對(duì)于用于顯示的日期/時(shí)間數(shù)值格式化,見Section 9.8。
date_part
函數(shù)是仿照在傳統(tǒng)的Ingres函數(shù)。等效于 SQL 標(biāo)準(zhǔn)函數(shù)extract
:
date_part('field',source)
Note that here thefieldparameter needs to
be a string value, not a name. The valid field names for
date_part
are the same as for
extract
.
請(qǐng)注意這里的field參數(shù)必須是一個(gè)字符串值,而不是一個(gè)名字。
date_part
的有效域名參數(shù)和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
date_trunc
.
date_trunc
函數(shù)在概念上和用于數(shù)字的trunc
函數(shù)類似。
date_trunc('field',source)
source是timestamp或interval類型的值表達(dá)式 (date和time類型的值都分別自動(dòng)轉(zhuǎn)換成timestamp或interval)。 用field選擇對(duì)該時(shí)間戳值用什么樣的精度進(jìn)行截?cái)?。返回的?shù)值 是timestamp或interval類型, 所有小于選定的精度的域都設(shè)置為零(日期和月份域則為 1)。
field的有效數(shù)值是:
microseconds |
milliseconds |
second |
minute |
hour |
day |
week |
month |
quarter |
year |
decade |
century |
millennium |
例如:
SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40'); Result:2001-02-16 20:00:00 SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40'); Result:2001-01-01 00:00:00
AT TIME ZONE構(gòu)造允許把時(shí)間戳轉(zhuǎn)換成不同的時(shí)區(qū)。表Table 9-28顯示了其變體。
Table 9-28. AT TIME ZONE變體
表達(dá)式 | 返回類型 | 描述 |
---|---|---|
timestamp without time zoneAT TIME ZONEzone | timestamp with time zone | 將不帶時(shí)區(qū)without time zone的時(shí)間戳轉(zhuǎn)換成給定時(shí)區(qū)的時(shí)間戳 |
timestamp with time zoneAT TIME ZONEzone | timestamp without time zone | 將帶時(shí)區(qū)with time zone的時(shí)間戳轉(zhuǎn)換為不帶時(shí)區(qū)的時(shí)間。 |
time with time zoneAT TIME ZONEzone | time with time zone | 將帶時(shí)區(qū)with time zone的時(shí)間轉(zhuǎn)換成給定時(shí)區(qū)的時(shí)間 |
在這些表達(dá)式里,zone可以聲明為文本串(比如'PST')或者一個(gè) 時(shí)間間隔(比如INTERVAL '-08:00')。 在文本的情況下,可用的時(shí)區(qū)名字在Section 8.5.3有詳細(xì)描述
Examples (assuming the local time zone isPST8PDT): 例子(假設(shè)本地時(shí)區(qū)是PST8PDT):
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST'; Result:2001-02-16 19:38:40-08 SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST'; Result:2001-02-16 18:38:40
第一個(gè)例子接受一個(gè)無(wú)時(shí)區(qū)的時(shí)間戳然后把它解釋成 MST(UTC-7) 時(shí)間生成 UTC 時(shí)間戳,然后把這個(gè)時(shí)間轉(zhuǎn)換為 PST(UTC-8) 顯示。第二個(gè)例子接受一個(gè) 聲明為 EST(UTC-5) 的時(shí)間戳,然后把它轉(zhuǎn)換成 MST(UTC-7) 的當(dāng)?shù)貢r(shí)間。
timezone
(zone,timestamp)
函數(shù)等效于 SQL 兼容的構(gòu)造timestampAT TIME ZONEzone
PostgreSQL提供許多返回當(dāng)前日期和時(shí)間的函數(shù)。 這些符合 SQL 標(biāo)準(zhǔn)的函數(shù)全部都按照當(dāng)前事務(wù)的開始時(shí)刻返回結(jié)果:
CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_TIME(precision) CURRENT_TIMESTAMP(precision) LOCALTIME LOCALTIMESTAMP LOCALTIME(precision) LOCALTIMESTAMP(precision)
CURRENT_TIME
和CURRENT_TIMESTAMP
返回帶有時(shí)區(qū)的值;
LOCALTIME
和LOCALTIMESTAMP
返回不帶時(shí)區(qū)的值
CURRENT_TIME
,
CURRENT_TIMESTAMP
,
LOCALTIME
和LOCALTIMESTAMP
可以有選擇地給予一個(gè)精度參數(shù),該精度導(dǎo)致結(jié)果的秒數(shù)域四舍五入到指定小數(shù)位。
如果沒(méi)有精度參數(shù),將給予所能得到的全部精度。
一些示例:
SELECT CURRENT_TIME; Result:14:39:53.662522-05 SELECT CURRENT_DATE; Result:2001-12-23 SELECT CURRENT_TIMESTAMP; Result:2001-12-23 14:39:53.662522-05 SELECT CURRENT_TIMESTAMP(2); Result:2001-12-23 14:39:53.66-05 SELECT LOCALTIMESTAMP; Result:2001-12-23 14:39:53.662522
因?yàn)檫@些函數(shù)全部都按照當(dāng)前事務(wù)的開始時(shí)刻返回結(jié)果,所以它們的值在事務(wù)運(yùn)行的整個(gè)期間內(nèi)都不改變。 我們認(rèn)為這是一個(gè)特性:目的是為了允許一個(gè)事務(wù)在"當(dāng)前時(shí)間"上有連貫的概念, 這樣在同一個(gè)事務(wù)里的多個(gè)修改可以保持同樣的時(shí)間戳。
Note: 許多其它數(shù)據(jù)庫(kù)系統(tǒng)更頻繁地更新這些數(shù)值
PostgreSQL同樣也提供了返回實(shí)時(shí)時(shí)間值的函數(shù), 它們的返回值會(huì)在事務(wù)中隨時(shí)間的前進(jìn)而變化。 這些不附合 SQL 標(biāo)準(zhǔn)的函數(shù)列表如下:
transaction_timestamp() statement_timestamp() clock_timestamp() timeofday() now()
transaction_timestamp()
等效于CURRENT_TIMESTAMP
,不過(guò)其命名準(zhǔn)確的表明了其
含義。statement_timestamp()
返回當(dāng)前事務(wù)開始時(shí)刻的時(shí)間戳(更準(zhǔn)確的說(shuō)是收到
客戶端最后一條命令的時(shí)間)。statement_timestamp()
和transaction_timestamp()
在一個(gè)事務(wù)的第一條命令里返回值相同,但是在隨后的命令中卻不一定相同。
clock_timestamp()
返回實(shí)時(shí)時(shí)鐘的當(dāng)前時(shí)間戳,因此它的值甚至在同一條
SQL 命令中都會(huì)變化。timeofday()
相當(dāng)于clock_timestamp()
,也返回實(shí)時(shí)
時(shí)鐘的當(dāng)前時(shí)間戳,由于歷史原因, 它返回一個(gè)text字符串,而不是timestamp with time zone值。
now()
是PostgreSQL的一個(gè)傳統(tǒng)的等效于transaction_timestamp()
。
所有日期/時(shí)間類型還接受特殊的文本值now,用于聲明當(dāng)前的日期和時(shí)間(重申:當(dāng)前事務(wù)的開始時(shí)刻)。 因此,下面三個(gè)都返回相同的結(jié)果
SELECT CURRENT_TIMESTAMP; SELECT now(); SELECT TIMESTAMP 'now'; -- incorrect for use with DEFAULT
Tip: 在創(chuàng)建表的時(shí)候你不應(yīng)該用第三種形式聲明一個(gè)DEFAULT值。 系統(tǒng)將在分析這個(gè)常量的時(shí)候把now轉(zhuǎn)換為一個(gè)timestamp, 因此這個(gè)缺省值就會(huì)變成創(chuàng)建表的時(shí)間!而前兩種形式要到實(shí)際使用缺省值的時(shí)候才計(jì)算, 因?yàn)樗鼈兪呛瘮?shù)調(diào)用。因此它們可以給出每次插入行的時(shí)刻。
下面的這個(gè)函數(shù)可以用于讓服務(wù)器進(jìn)程延時(shí)執(zhí)行:
pg_sleep(seconds)
pg_sleep
讓當(dāng)前的會(huì)話進(jìn)程休眠seconds秒以后再執(zhí)行。
seconds是一個(gè)double precision類型的值,所以可以指定帶小數(shù)的秒數(shù)。
例如:
SELECT pg_sleep(1.5);
Note: 有效的休眠時(shí)間間隔精度是平臺(tái)相關(guān)的,通常 0.01 秒是通用的。休眠的時(shí)間將至少等于指定的時(shí)間, 也有可能由于服務(wù)器荷載較重等原因而比指定的時(shí)間長(zhǎng)。
Warning |
請(qǐng)確保調(diào)用 |
[1] | 60 ,如果閏秒由操作系統(tǒng)實(shí)現(xiàn)。 |