OceanBase 日期時(shí)間格式化

2021-06-17 15:09 更新

日期時(shí)間格式化指定了存儲(chǔ)在數(shù)據(jù)庫(kù)中日期時(shí)間數(shù)據(jù)的格式。日期時(shí)間格式化的總長(zhǎng)度不能超過 22 個(gè)字符。

函數(shù)中的日期時(shí)間格式化

日期時(shí)間格式化出現(xiàn)在下面的數(shù)據(jù)類型轉(zhuǎn)換中:

  • 將非默認(rèn)格式的字符值轉(zhuǎn)換為日期時(shí)間值時(shí),需要 ?TO_DATE?、?TO_TIMESTAMP? 和 ?TO_TIMESTAMP_TZ? 函數(shù)的參數(shù)指定日期時(shí)間的格式。
  • 將日期時(shí)間值轉(zhuǎn)換為非默認(rèn)格式的字符值時(shí),需要指定 ?TO_CHAR? 函數(shù)的參數(shù)。

您可以通過以下方式指定日期時(shí)間格式。

  • 通過會(huì)話參數(shù) ?NLS_DATE_FORMAT?、?NLS_TIMESTAMP_FORMAT? 或 ?NLS_TIMESTAMP_TZ_FORMAT? 顯式指定。
  • 通過會(huì)話參數(shù) ?NLS_TERRITORY? 隱式指定。
  • ?ALTER SESSION? 語句更改會(huì)話的默認(rèn)日期時(shí)間格式。

日期時(shí)間格式化

日期時(shí)間格式化由一個(gè)或多個(gè)日期時(shí)間格式化元素組成。OceanBase 數(shù)據(jù)庫(kù)支持的格式化元素請(qǐng)查閱 日期時(shí)間格式化元素表。

  • 在格式化字符串中,相同的格式化元素不能出現(xiàn)兩次,表示類似信息的格式化元素不能組合。例如,您不能在一個(gè)格式化字符串中同時(shí)使用 ?SYYYY?和 ?BC? 元素。
  • 所有格式化元素都可以在 ?TO_CHAR?、?TO_DATE?、?TO_TIMESTAMP? 和 ?TO_TIMESTAMP_TZ? 函數(shù)中使用。
  • 日期時(shí)間格式化元素 ?FF?、?TZD?、?TZH?、?TZM? 和 ?TZR?可以出現(xiàn)在時(shí)間戳和間隔格式化中,但不能出現(xiàn)在 ?DATE? 格式中。
  • 許多日期時(shí)間格式元素被空白填充或用零填充至指定的長(zhǎng)度。
注意 
建議您使用 4 位數(shù)的年份元素(?YYYY?),較短的年份元素會(huì)影響查詢優(yōu)化,因?yàn)槟攴葜荒茉谶\(yùn)行時(shí)確定。

日期時(shí)間格式化元素表

元素

日期時(shí)間函數(shù)是否支持?

說明

- / , 。 ; : “文字”

標(biāo)點(diǎn)和引用的文本會(huì)在結(jié)果中復(fù)制。

AD A.D.

表示公元紀(jì)年法,帶有或不帶有點(diǎn)號(hào)。

AM A.M.

表示上午,帶有或不帶有點(diǎn)號(hào)。

BC B.C.

表示公元前的年份,帶有或不帶有點(diǎn)號(hào)。

D

星期幾(1-7)。

DAY

一天的名稱。

DD

每月的一天(1-31)。

DDD

一年中的某天(1-366)。

DL

只能打印類似 "Monday, January, 01, 1996" 的固定格式。

DS

只能打印類似 "10-10-1996" 的固定格式。

DY

日期的縮寫,返回星期值。

FF [1..9]

小數(shù)秒。使用數(shù)字 1~9 來指定返回值的小數(shù)秒部分的位數(shù)。默認(rèn)為日期時(shí)間數(shù)據(jù)類型指定的精度。在時(shí)間戳和間隔格式中有效,但在 DATE 格式中無效。

FX

需要字符數(shù)據(jù)和格式模型之間的精確匹配。

HHHH12

小時(shí)(1-12)。12 小時(shí)制

HH24

小時(shí)(0-23)。24 小時(shí)制

YYYY

包含4位數(shù)字的年份。

MI

分鐘(0-59)。

MM

月(01-12;一月份表示為 01 )。

MON

月份的縮寫。

MONTH

月份名稱。

PM P.M.

表示下午,帶有或不帶有點(diǎn)號(hào)。

Q

季度(1、2、3、4; 1月-3月是第 1 季度)。

RR

RR 匹配兩位數(shù)的年份。

RRRR

年。接受4位或2位輸入。

SS

秒(0-59)。

SSSSS

午夜后的秒(0-86400)。

TZD

夏令時(shí)信息。TZD 值是帶有夏令時(shí)信息的縮寫時(shí)區(qū)字符串。在時(shí)間戳和間隔格式中有效,但在 DATE 格式中無效。

TZH

時(shí)區(qū)小時(shí)。在時(shí)間戳和間隔格式中有效,但在 DATE 格式中無效。

TZM

時(shí)區(qū)分鐘。在時(shí)間戳和間隔格式中有效,但在 DATE 格式中無效。

TZR

時(shí)區(qū)區(qū)域信息。在時(shí)間戳和間隔格式中有效,但在 DATE 格式中無效。

X

小數(shù)點(diǎn),永遠(yuǎn)是 '.' 。

Y,YYY

帶逗號(hào)的年。

YYYYSYYYY

4位數(shù)字的年份。 S 代表用一個(gè)負(fù)號(hào)表示公元前的日期。

YYYYYY

年份的后 3、2 或 1 位數(shù)字。

說明 
日期時(shí)間函數(shù)指的是?TO_CHAR?、?TO_DATE?、?TO_TIMESTAMP? 和 ?TO_TIMESTAMP_TZ? 。

注意,以上轉(zhuǎn)化要求輸入的字符串日期能夠與格式元素相匹配,否則會(huì)報(bào)錯(cuò),例如:

obclient> SELECT TO_DATE( '31 Aug 2020', 'DD MON YYYY' ) FROM DUAL;
+----------------------------------+
| TO_DATE('31AUG2020','DDMONYYYY') |
+----------------------------------+
| 2020-08-31 00:00:00              |
+----------------------------------+
1 row in set (0.00 sec)
注意 
OceanBase 數(shù)據(jù)庫(kù)中默認(rèn)的日期格式為 DD-MON-RR,如果要顯示為上面的格式,可以通過執(zhí)行 alter session set NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; 修改當(dāng)前會(huì)話的日期時(shí)間格式。

當(dāng)您的格式串漏掉了一些元素時(shí),會(huì)得到系統(tǒng)的報(bào)錯(cuò)信息:

obclient> SELECT TO_DATE( '31 Aug 2020', 'DD MON YYY' ) FROM DUAL;
ORA-01830: date format picture ends before converting entire input string

日期格式化元素中的大寫字母

拼寫出來的單詞、縮寫詞或羅馬數(shù)字中的大寫字母在相應(yīng)的格式元素中也跟著大寫。例如,日期格式元素 ?DAY? 產(chǎn)生的 ?MONDAY? 也大寫,?Day? 和 ?Monday? 格式一樣,?day? 和 ?monday? 格式一樣。

obclient> SELECT TO_CHAR(sysdate,'mon')  AS nowMonth FROM DUAL;
+----------+
| NOWMONTH |
+----------+
| mar      |
+----------+
1 row in set (0.00 sec)

obclient> SELECT TO_CHAR(sysdate,'MON')  AS nowMonth FROM DUAL;
+----------+
| NOWMONTH |
+----------+
| MAR      |
+----------+
1 row in set (0.00 sec)
    

日期時(shí)間格式化中的標(biāo)點(diǎn)符號(hào)和字符字面量

以下字符需要日期格式化,這些字符出現(xiàn)在返回值中的位置與格式化中字符的位置相同:

  • 標(biāo)點(diǎn)符號(hào),例如連字符,斜杠,逗號(hào),句號(hào)和冒號(hào)。
  • 字符字面量,用雙引號(hào)引起來。

OceanBase 數(shù)據(jù)庫(kù)可以靈活的將字符串轉(zhuǎn)換為日期。當(dāng)您使用 ?TO_DATE? 函數(shù)時(shí),若輸入字符串中的每個(gè)數(shù)字元素都包含格式化允許的最大位數(shù),則格式字符串將與輸入的字符串匹配。

  • 示例 1:格式元素 MM/YY,其中 02 對(duì)應(yīng) MM07 對(duì)應(yīng) YY。

執(zhí)行以下語句:

SELECT TO_CHAR(TO_DATE('0207','MM/YY'),'MM/YY') FROM DUAL;

查詢結(jié)果如下:

+------------------------------------------+
| TO_CHAR(TO_DATE('0207','MM/YY'),'MM/YY') |
+------------------------------------------+
| 02/07                                    |
+------------------------------------------+
  • 示例 2:OceanBase 數(shù)據(jù)庫(kù)允許非字母數(shù)字字符與格式化中的標(biāo)點(diǎn)字符匹配,# 對(duì)應(yīng) /。

執(zhí)行以下語句:

 SELECT TO_CHAR (TO_DATE('02#07','MM/YY'), 'MM/YY') FROM DUAL;

查詢結(jié)果如下:

+-------------------------------------------+
| TO_CHAR(TO_DATE('02#07','MM/YY'),'MM/YY') |
+-------------------------------------------+
| 02/07                                     |
+-------------------------------------------+

日期格式化元素與全球化支持

在 OceanBase 數(shù)據(jù)庫(kù)中,日期時(shí)間格式化元素的語言可以通過參數(shù) ?NLS_DATE_LANGUAGE? 和 ?NLS_LANGUAGE? 指定。默認(rèn)值是 ?AMERICAN?,不支持修改,所以不支持全球化。

示例:日期時(shí)間格式化的語言參數(shù)默認(rèn)是 ?American?,不支持其他語言。

SELECT TO_CHAR (SYSDATE, 'DD/MON/YYYY', 'nls_date_language=''Traditional Chinese'' ') FROM DUAL;

查詢結(jié)果報(bào)錯(cuò),語言參數(shù)不支持。

ORA-12702: invalid NLS parameter string used in SQL function

更多信息


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)