B.1. 日期時間解譯流程
日期時間資料將會以下列流程解譯:(分隔符號均為半型文字)
- 以分隔符號將其分解為多個段落,如字串、時區或數字。
- 如果是以冒號(:)分隔的數字格式,那麼這是一個時間的字串,其所包括的內容都是時間資訊的一部份。
- 如果是以連字號(-)、斜線(/)、或兩個以上的間隔號(.)所分隔的數字格式,那麼這是一個日期的字串,它可能包含文字型式的月份名稱。但如果日期分隔符號已經先出現了,那麼它將被解釋為時區資訊(例如:Asia/Taipei)。
- 如果整個字串都是數字所組成,那麼它可能是符合ISO 8601格式的日期(例如:19990113,表示西元1999年1月3日),或時間(例如:141516,表示14:15:16)。
- 如果它是以加號(+)或減號(-)開頭的話,那麼它是一個數字型態的時區資訊或是特別的區間。
- 如果是一個字串,進行下列比對規則:
- 以binary-search表格,尋找時區的表示字。
- 如果沒有找到的話,則搜尋慣用字(如:today),星期(如:Thursday),月份(如:January),或介系詞(如:at, on)。
- 如果都沒有找到,就回傳錯誤訊息。
- 如果是一個由數字組成的字串,則進行下列判斷:
- 如果是8個或6個數字,而先前也沒有讀到其他日期的資訊,那麼它會被解譯為一個數字型態的日期(如:19990118或990118),對應年月日格式為YYYYMMDD或YYMMDD。
- 如果是3位數字,而且先前已處理到年份資訊的話,那麼它會被解譯為該年的第幾天。
- 如果是4位或6位數字,而且先前已處理到年份資訊的話,那麼它會被解譯為時間資訊,對應格式為HHMM或HHMMSS。
- 如果是3個或更多的數字,並且先前未處理到日期資訊的話,那麼它會是年份資訊。(這里將直接判斷為yy-mm-dd的日期格式。)
- 最後,日期格式將依DateStyle所定義的,設定為:mm-dd-yy,dd-mm-yy,或yy-mm-dd。其中如果月份或日子名稱無法找到合法字詞的話,那將會回傳錯誤的訊息。
- 如果指定了BC(西元前)的話,那麼實際儲存值將是負的年份數再加1。(陽曆Gregorian year中並無西元0年,所以西元1年,以數值0作為年份的記錄值。)
- 沒有指定BC的2位數年份,將自動被調整為4位數。其規則為:若小於70,則加2000作為其記錄值,否則就加1900作為記錄值。
小技巧
- 若需要描述西元(Gregorian years AD) 1-99年,請將年份數值以0補滿4位數(例如:0099表西元99年)。
- https://www.postgresql.org/docs/10/static/datetime-input-rules.html