<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 9.9\. 時間/日期函數和操作符 [Table 9-27](#calibre_link-1535)顯示了可以用于處理日期/時間數值的函數, 隨后一節里描述了細節。[Table 9-26](#calibre_link-2213) 演示了基本算術操作符的行為(`+`,`*`, 等)。 而與格式化相關的函數,可以參考[Section 9.8](#calibre_link-800)。 你應該很熟悉[Section 8.5](#calibre_link-783)的日期/時間數據類型的背景知識。 所有下述函數和操作符接收的`time`或`timestamp`輸入實際上都來自兩種可能: 一種是接收`time with time zone`或`timestamp with time zone`, 另外一種是接收`time without time zone`或`timestamp without time zone`。 出于簡化考慮,這些變種沒有獨立顯示出來。還有,`+`和`*` 操作符都是以可交換的操作符對(比如,date + integer 和 integer + date); 我們只顯示了這樣的交換操作符對中的一個。 **Table 9-26\. 日期/時間操做符** | 操作符 | 例子 | 結果 | | --- | --- | --- | | `+` | `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\. 日期/時間函數** | 函數 | 返回類型 | 描述 | 例子 | 結果 | | --- | --- | --- | --- | --- | | ``age(```timestamp`, `timestamp`) | `interval` | 減去參數后的"符號化"結果 | `age(timestamp '2001-04-10', timestamp '1957-06-13')` | `43 years 9 mons 27 days` | | ``age(```timestamp`) | `interval` | 從`current_date`減去參數后的結果(在午夜) | `age(timestamp '1957-06-13')` | `43 years 8 mons 3 days` | | ``clock_timestamp()`` | `timestamp with time zone` | 實時時鐘的當前時間戳(在語句執行時變化);見[Section 9.9.4](#calibre_link-796) | | ``current_date`` | `date` | 當前的日期;見[Section 9.9.4](#calibre_link-796) | | ``current_time`` | `time with time zone` | 當日時間;見[Section 9.9.4](#calibre_link-796) | | ``current_timestamp`` | `timestamp with time zone` | 當前事務開始時的時間戳;見[Section 9.9.4](#calibre_link-796) | | ``date_part(```text`, `timestamp`) | `double precision` | 獲取子域(等效于`extract`);又見[Section 9.9.1](#calibre_link-1876) | `date_part('hour', timestamp '2001-02-16 20:38:40')` | `20` | | ``date_part(```text`, `interval`) | `double precision` | 獲取子域(等效于`extract`);又見[Section 9.9.1](#calibre_link-1876) | `date_part('month', interval '2 years 3 months')` | `3` | | ``date_trunc(```text`, `timestamp`) | `timestamp` | 截斷成指定的精度;又見[Section 9.9.2](#calibre_link-1877) | `date_trunc('hour', timestamp '2001-02-16 20:38:40')` | `2001-02-16 20:00:00` | | ``extract`(``field` from `timestamp`) | `double precision` | 獲取子域;又見[Section 9.9.1](#calibre_link-1876) | `extract(hour from timestamp '2001-02-16 20:38:40')` | `20` | | ``extract`(``field` from `interval`) | `double precision` | 獲取子域;又見[Section 9.9.1](#calibre_link-1876) | `extract(month from interval '2 years 3 months')` | `3` | | ``isfinite(```date`) | `boolean` | 測試是否為有窮日期(不是 +/-無窮) | `isfinite(date '2001-02-16')` | `true` | | ``isfinite(```timestamp`) | `boolean` | 測試是否為有窮時間戳(不是 +/-無窮) | `isfinite(timestamp '2001-02-16 21:28:30')` | `true` | | ``isfinite(```interval`) | `boolean` | 測試是否為有窮時間間隔 | `isfinite(interval '4 hours')` | `true` | | ``justify_days(```interval`) | `interval` | 按照每月 30 天調整時間間隔 | `justify_days(interval '35 days')` | `1 mon 5 days` | | ``justify_hours(```interval`) | `interval` | 按照每天 24 小時調整時間間隔 | `justify_hours(interval '27 hours')` | `1 day 03:00:00` | | ``justify_interval(```interval`) | `interval` | 使用`justify_days`和`justify_hours`調整時間間隔的同時進行正負號調整 | `justify_interval(interval '1 mon -1 hour')` | `29 days 23:00:00` | | ``localtime`` | `time` | 當日時間;見[Section 9.9.4](#calibre_link-796) | | ``localtimestamp`` | `timestamp` | 當前事務開始時的時間戳;見[Section 9.9.4](#calibre_link-796) | | ``now()`` | `timestamp with time zone` | 當前事務開始時的時間戳;見[Section 9.9.4](#calibre_link-796) | | ``statement_timestamp()`` | `timestamp with time zone` | 實時時鐘的當前時間戳;見[Section 9.9.4](#calibre_link-796) | | ``timeofday()`` | `text` | 與`clock_timestamp`相同,但結果是一個`text` 字符串;見[Section 9.9.4](#calibre_link-796) | | ``transaction_timestamp()`` | `timestamp with time zone` | 當前事務開始時的時間戳;見[Section 9.9.4](#calibre_link-796) | 除了這些函數以外,還支持 SQL 的`OVERLAPS`操作符: ``` (_start1_, _end1_) OVERLAPS (_start2_, _end2_) (_start1_, _length1_) OVERLAPS (_start2_, _length2_) ``` 這個表達式在兩個時間域(用它們的終點定義)重疊的時候生成真值,在不重疊是生成假值。 終點可以用一對日期、時間、時間戳來聲明;或者是一個后面跟著一個時間間隔的日期、 時間、時間戳。當提供一對值,不管先寫開始還是結束;`OVERLAPS` 自動將這對值較早的作為開始。每段時間取值為半開區間`_開始_` `&lt;=` `_時間_` `&lt;` `_結束_`,除非`_開始_` 和`_結束_`相等,此時表示單一的時刻。 這意味著兩個時間段只有一個共同的端點沒有重疊。 ``` SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS (DATE '2001-10-30', DATE '2002-10-30'); _Result:_ <samp class="literal">true</samp> SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS (DATE '2001-10-30', DATE '2002-10-30'); _Result:_ <samp class="literal">false</samp> SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS (DATE '2001-10-30', DATE '2001-10-31'); _Result:_ <samp class="literal">false</samp> SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS (DATE '2001-10-30', DATE '2001-10-31'); _Result:_ <samp class="literal">true</samp> ``` 當把`interval`值添加到`timestamp with time zone`上(或從中減去)的時候, days 部分會按照指定的天數增加(或減少)`timestamp with time zone`的日期。 對于橫跨夏令時的變化(會話的時區設置被識別為夏時制),`interval '1 day'` 并不一定等于`interval '24 hours'`。例如,當會話的時區設置為`CST7CDT` 的時候`timestamp with time zone '2005-04-02 12:00-07' + interval '1 day'` 的結果是`timestamp with time zone '2005-04-03 12:00-06'`, 而將`interval '24 hours'`增加到相同的`timestamp with time zone` 之上的結果則是`timestamp with time zone '2005-04-03 13:00-06'`, 因為`CST7CDT`時區在`2005-04-03 02:00`的時候有一個夏令時變更。 注意`age`返回的`月數`可能有歧義, 因為不同的月份有不同的天數。PostgreSQL的方法是當計算部分月數時, 采用兩個日期較早的月。例如:`age('2004-06-01', '2004-04-30')` 使用4月份產生`1 mon 1 day`,當用5月分時產生`1 mon 2 days`, 因為5月有31天,而4月只有30天。 ## 9.9.1\. `EXTRACT`, `date_part` ``` EXTRACT(_field_ FROM _source_) ``` `extract`函數從日期/時間數值里抽取子域,比如年、小時等。 `_source_`必須是一個`timestamp`, `time`, `interval`類型的值表達式(類型為`date`的表達式轉換為 `timestamp`,因此也可以用)。`_field_` 是一個標識符或者字符串,它指定從源數據中抽取的域。`extract` 函數返回類型為`double precision`的數值。下列數值是有效數據域的名字: `century` 世紀 ``` SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); _Result:_ &lt;samp class="literal"&gt;20&lt;/samp&gt; SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;21&lt;/samp&gt; ``` 第一個世紀從 0001-01-01 00:00:00 AD 開始,盡管那時候人們還不知道這是第一個世紀。 這個定義適用于所有使用陽歷的國家。沒有 0 世紀,我們直接從公元前 1 世紀到公元 1 世紀。 如果你認為這個不合理,那么請把抱怨發給:梵蒂岡,羅馬圣彼得教堂,教皇收。 PostgreSQL 8.0 以前版本里并不遵循世紀的習慣編號, 只是把年份除以 100 。 `day` 對于`timestamp`值,(月份)里的日期(1-31);對于`interval`,天數 ``` SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;16&lt;/samp&gt; SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); _Result:_ &lt;samp class="literal"&gt;40&lt;/samp&gt; ``` `decade` 年份除以 10 ``` SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;200&lt;/samp&gt; ``` `dow` 每周的星期號,星期天(`0`)到星期六(`6`) ``` SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;5&lt;/samp&gt; ``` 請注意,`extract`的星期幾編號和`to_char(..., 'D')`函數不同。 `doy` 一年的第幾天(1-365/366) ``` SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;47&lt;/samp&gt; ``` `epoch` 對于`timestamp with time zone`值而言, 是自 1970-01-01 00:00:00-00 UTC以來的秒數(結果可能是負數); 對于`date`和`timestamp`值而言, 是自 1970-01-01 00:00:00 當地時間以來的秒數; 對于`interval`值而言,它是時間間隔的總秒數。 ``` SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); _Result:_ &lt;samp class="literal"&gt;982384720.12&lt;/samp&gt; SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); _Result:_ &lt;samp class="literal"&gt;442800&lt;/samp&gt; ``` 下面是把 epoch 值轉換回時間戳的方法: ``` SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second'; ``` (`to_timestamp`函數封裝上面的轉換。) `hour` 小時域(0-23) ``` SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;20&lt;/samp&gt; ``` `isodow` 周中的第幾天 [1-7] 星期一:(`1`)星期天:(`7`)。 ``` SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); _Result:_ &lt;samp class="literal"&gt;7&lt;/samp&gt; ``` 除了星期天外,都與`dow`相同。這與ISO 8601標準周中的第幾天編碼相匹配。 `isoyear` 日期中的ISO 8601標準年(不適用于間隔)。 ``` SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); _Result:_ &lt;samp class="literal"&gt;2005&lt;/samp&gt; SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); _Result:_ &lt;samp class="literal"&gt;2006&lt;/samp&gt; ``` 每個帶有星期一開始的周中包含1月4日的ISO年, 所以在年初的1月或12月下旬的ISO年可能會不同于陽歷的年。 見`week`獲取更多信息。 這個域不能用于 PostgreSQL 8.3之前的版本。 `microseconds` 秒域(包括小數部分)乘以 1,000,000 。請注意它包括全部的秒。 ``` SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); _Result:_ &lt;samp class="literal"&gt;28500000&lt;/samp&gt; ``` `millennium` 千年 ``` SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;3&lt;/samp&gt; ``` 20 世紀(19xx 年)里面的年份在第二個千年里。第三個千年從 2001 年 1 月 1 日零時開始。 PostgreSQL 8.0 之前的版本并不遵循千年編號的習慣, 只是返回年份除以 1000 。 `milliseconds` 秒域(包括小數部分)乘以 1000 。請注意它包括完整的秒。 ``` SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); _Result:_ &lt;samp class="literal"&gt;28500&lt;/samp&gt; ``` `minute` 分鐘域(0-59) ``` SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;38&lt;/samp&gt; ``` `month` 對于`timestamp`值,它是一年里的月份數(1-12);對于`interval`值, 它是月的數目,然后對 12 取模(0-11) ``` SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;2&lt;/samp&gt; SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months'); _Result:_ &lt;samp class="literal"&gt;3&lt;/samp&gt; SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months'); _Result:_ &lt;samp class="literal"&gt;1&lt;/samp&gt; ``` `quarter` 該天所在的該年的季度(1-4) ``` SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;1&lt;/samp&gt; ``` `second` 秒域,包括小數部分(0-59) \[1\] ``` SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;40&lt;/samp&gt; SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); _Result:_ &lt;samp class="literal"&gt;28.5&lt;/samp&gt; ``` `timezone` 與 UTC 的時區偏移量,以秒記。正數對應 UTC 東邊的時區,負數對應 UTC 西邊的時區。 (技術角度講,PostgreSQL使用UT1,因為不處理閏秒。) `timezone_hour` 時區偏移量的小時部分。 `timezone_minute` 時區偏移量的分鐘部分。 `week` 該天在所在的年份里是第幾周。ISO 8601 定義一年的第一周包含該年的一月四日(ISO-8601 的周從星期一開始)。換句話說, 一年的第一個星期四在第一周。 在ISO定義里,一月的頭幾天可能是前一年的第 52 或者第 53 周, 十二月的后幾天可能是下一年第一周。比如,`2005-01-01`是 2004 年的第 53 周, 而`2006-01-01`是 2005 年的第 52 周,`2012-12-31`是2013年的第一周。 建議`isoyear`字段和`week`一起使用以得到一致的結果。 ``` SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;7&lt;/samp&gt; ``` `year` 年份域。要記住這里沒有`0 AD`,所以從`AD`年里抽取`BC`年應該小心些。 ``` SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); _Result:_ &lt;samp class="literal"&gt;2001&lt;/samp&gt; ``` `extract`函數主要的用途是運算。 對于用于顯示的日期/時間數值格式化,參閱[Section 9.8](#calibre_link-800)。 `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:_ <samp class="literal">16</samp> SELECT date_part('hour', INTERVAL '4 hours 3 minutes'); _Result:_ <samp class="literal">4</samp> ``` ## 9.9.2\. `date_trunc` `date_trunc`函數在概念上和用于數字的`trunc`函數類似。 ``` date_trunc('_field_', _source_) ``` `_source_`是`timestamp`或`interval` 類型的值表達式(`date`和`time`類型的值都分別自動轉換成 `timestamp`或`interval`)。用`_field_` 選擇對該時間戳值用什么樣的精度進行截斷。返回的數值是`timestamp` 或`interval`類型,所有小于選定的精度的域都設置為零(日期和月份域則為 1)。 `_field_`的有效數值是: | `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:_ <samp class="literal">2001-02-16 20:00:00</samp> SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40'); _Result:_ <samp class="literal">2001-01-01 00:00:00</samp> ``` ## 9.9.3\. `AT TIME ZONE` `AT TIME ZONE`構造允許把時間戳轉換成不同的時區。 [Table 9-28](#calibre_link-2215)顯示了其變體。 **Table 9-28\. `AT TIME ZONE` 變體** | 表達式 | 返回類型 | 描述 | | --- | --- | --- | | `timestamp without time zone` AT TIME ZONE `_zone_` | `timestamp with time zone` | 把給出的_不帶時區_的時間戳轉換成給定時區的時間戳 | | `timestamp with time zone` AT TIME ZONE `_zone_` | `timestamp without time zone` | 把給出的_帶時區_的時間戳轉換成未指定時區的時間戳 | | `time with time zone` AT TIME ZONE `_zone_` | `time with time zone` | 把給出的_帶時區_的時間轉換成給定時區的時間 | 在這些表達式里,`_zone_`可以聲明為文本串(比如`'PST'`) 或者一個時間間隔(比如`INTERVAL '-08:00'`)。在文本的情況下, 可用的時區名字在[Section 8.5.3](#calibre_link-792)有詳細描述。 例子(假設本地時區是`PST8PDT`): ``` SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST'; _Result:_ <samp class="literal">2001-02-16 19:38:40-08</samp> SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST'; _Result:_ <samp class="literal">2001-02-16 18:38:40</samp> ``` 第一個例子接受一個無時區的時間戳然后把它解釋成 MST(UTC-7) 時間生成 UTC 時間戳, 然后把這個時間轉換為 PST(UTC-8) 顯示。第二個例子接受一個聲明為 EST(UTC-5) 的時間戳, 然后把它轉換成 MST(UTC-7) 的當地時間。 `timezone`(`_zone_`, `_timestamp_`) 函數等效于 SQL 兼容的構造`_timestamp_` AT TIME ZONE `_zone_`。 ## 9.9.4\. 當前日期/時間 PostgreSQL提供許多返回當前日期和時間的函數。 這些符合 SQL 標準的函數全部都按照當前事務的開始時刻返回結果: ``` CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_TIME(_precision_) CURRENT_TIMESTAMP(_precision_) LOCALTIME LOCALTIMESTAMP LOCALTIME(_precision_) LOCALTIMESTAMP(_precision_) ``` `CURRENT_TIME`和`CURRENT_TIMESTAMP` 返回帶有時區的值;`LOCALTIME`和`LOCALTIMESTAMP` 返回不帶時區的值。 `CURRENT_TIME`,`CURRENT_TIMESTAMP`, `LOCALTIME`,`LOCALTIMESTAMP` 可以有選擇地獲取一個精度參數,該精度導致結果的秒數域園整到指定小數位。 如果沒有精度參數,將給予所能得到的全部精度。 一些例子: ``` SELECT CURRENT_TIME; _Result:_ <samp class="literal">14:39:53.662522-05</samp> SELECT CURRENT_DATE; _Result:_ <samp class="literal">2001-12-23</samp> SELECT CURRENT_TIMESTAMP; _Result:_ <samp class="literal">2001-12-23 14:39:53.662522-05</samp> SELECT CURRENT_TIMESTAMP(2); _Result:_ <samp class="literal">2001-12-23 14:39:53.66-05</samp> SELECT LOCALTIMESTAMP; _Result:_ <samp class="literal">2001-12-23 14:39:53.662522</samp> ``` 因為這些函數全部都按照當前事務的開始時刻返回結果, 所以它們的值在事務運行的整個期間內都不改變。我們認為這是一個特性: 目的是為了允許一個事務在"當前時間"上有連貫的概念, 這樣在同一個事務里的多個修改可以保持同樣的時間戳。 > **Note:** 許多其它數據庫系統更頻繁地更新這些數值。 PostgreSQL同樣也提供了返回實時時間值的函數, 它們的返回值會在事務中隨時間的前進而變化。這些不附合 SQL 標準的函數列表如下: ``` transaction_timestamp() statement_timestamp() clock_timestamp() timeofday() now() ``` `transaction_timestamp()`等效于`CURRENT_TIMESTAMP`, 不過其命名準確的表明了其含義。`statement_timestamp()` 返回當前事務開始時刻的時間戳(更準確的說是收到客戶端最后一條命令的時間)。 `statement_timestamp()`和`transaction_timestamp()` 在一個事務的第一條命令里返回值相同,但是在隨后的命令中卻不一定相同。 c`clock_timestamp()`返回實時時鐘的當前時間戳, 因此它的值甚至在同一條 SQL 命令中都會變化。`timeofday()`是一個歷史的 PostgreSQL函數,類似于`clock_timestamp()`, 它也返回實時時鐘的當前時間戳,不過它返回一個格式化了的`text`字符串, 而不是`timestamp with time zone`值。`now()` 是傳統的PostgreSQL和`transaction_timestamp()`等效的函數。 所有日期/時間類型還接受特殊的文本值`now`, 用于聲明當前的日期和時間(重申:當前事務的開始時刻)。 因此,下面三個都返回相同的結果: ``` SELECT CURRENT_TIMESTAMP; SELECT now(); SELECT TIMESTAMP 'now'; -- incorrect for use with DEFAULT ``` > **Tip:** 在創建表的時候你不應該用第三種形式聲明一個`DEFAULT`值。 系統將在分析這個常量的時候把`now`轉換為一個`timestamp`, 因此這個缺省值就會變成創建表的時間!而前兩種形式要到實際使用缺省值的時候才計算, 因為它們是函數調用。因此它們可以給出每次插入行的時刻。 ## 9.9.5\. 延時執行 下面的這個函數可以用于讓服務器進程延時執行: ``` pg_sleep(_seconds_) ``` `pg_sleep`讓當前的會話進程休眠`_seconds_` 秒以后再執行。`_seconds_`是一個`double precision` 類型的值,所以可以指定帶小數的秒數。例如: ``` SELECT pg_sleep(1.5); ``` > **Note:** 有效的休眠時間間隔精度是平臺相關的,通常 0.01 秒是通用的。 休眠的時間將至少等于指定的時間,也有可能由于服務器荷載較重等原因而比指定的時間長。 | **Warning** | |:--- | | 請確保調用`pg_sleep`的會話沒有持有不必要的鎖。 否則其它會話可能必須等待這個休眠的會話釋放所持有的鎖,從而減慢系統速度。 | ### Notes \[1\] 如果操作系統實現了潤秒,那么上限是 60 。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看