1. 程式人生 > 其它 >第147章 SQL函式 TO_TIMESTAMP

第147章 SQL函式 TO_TIMESTAMP

文章目錄

第147章 SQL函式 TO_TIMESTAMP

將格式化字串轉換為時間戳的日期函式。

大綱

TO_TIMESTAMP(date_string[,format])

引數

  • date_string - 要轉換為時間戳的字串表示式。此表示式可能包含日期值、時間值或日期和時間值。
  • format - 可選 — 對應於 date_string 的日期和時間格式字串。如果省略,則預設為 DD MON YYYY HH:MI:SS

描述

TO_TIMESTAMP 函式將各種格式的日期和時間字串轉換為標準時間戳,資料型別為 TIMESTAMPTO_TIMESTAMP 返回具有以下格式的時間戳:

yyyy-mm-dd hh:mm:ss

始終包括前導零。時間使用 24 小時制指定。預設情況下,返回的時間戳不包括小數秒。

注意:TO_TIMESTAMPODBC 格式返回標準時間戳。 TO_POSIXTIME 返回一個編碼的 64 位時間戳。 TO_POSIXTIME 是新程式設計的推薦時間戳格式。

必須指定匹配的 date_string 和格式。如果省略格式,則 date_string 必須匹配 DD MON YYYY HH:MI:SS

如果 date_string 省略了時間戳的組成部分,則 TO_TIMESTAMP 提供缺少的組成部分。如果 date_stringformat 都省略了年份,則 yyyy 預設為當前年份;如果只有 date_string 省略了年份,則預設為 00,根據年份格式元素擴充套件為四位數年份。如果省略日或月值,則 dd 預設為 01mm-dd 預設為 01-01。因此,如果 date_stringformat 都省略了時間戳的日期部分,則 TO_TIMESTAMP 預設為當年的 1 月 1 日,採用 ODBC 格式:yyyy-01-01

缺少的時間元件預設為 00。支援小數秒,但必須明確指定;預設情況下不提供小數秒。

TO_TIMESTAMP 支援將兩位數年份轉換為四位數。 TO_TIMESTAMP 支援將 12 小時制時間轉換為 24 小時制時間。它提供日期和時間元素值的範圍驗證,包括閏年驗證。範圍驗證違規會生成 SQLCODE -400 錯誤。

也可以使用 TOTIMESTAMP() 方法呼叫從 ObjectScript 呼叫此函式:

$SYSTEM.SQL.Functions.TOTIMESTAMP(date_string,format)

在為時間戳欄位提供預設值時,可以在資料定義中使用 TO_TIMESTAMP 函式。例如:

CREATE TABLE Sample.MyEmpReviews
(EmpNum INTEGER UNIQUE NOT NULL,
 ReviewDate TIMESTAMP DEFAULT TO_TIMESTAMP(365,'DDD'))

在此示例中,插入記錄的使用者可以提供 ReviewDate 值,不提供 ReviewDate 值並獲取當年第 365 天的預設時間戳,或者提供 NULLReviewDate 並獲取 NULL

TO_TIMESTAMP 可以與 CREATE TABLEALTER TABLE ADD COLUMN 語句一起使用。在此上下文中只能使用 date_string 的文字值。

相關 SQL 函式

  • TO_TIMESTAMP 將格式化的日期和時間字串轉換為標準時間戳。
  • TO_CHAR 執行相反的操作;它將標準時間戳轉換為格式化的日期和時間字串。
  • TO_DATE 將格式化的日期字串轉換為日期整數。
  • CASTCONVERT 執行 TIMESTAMP 資料型別轉換。

日期和時間字串

date_string 引數指定日期和時間字串文字。如果提供沒有時間分量的日期字串,則 TO_TIMESTAMP 提供時間值 00:00:00。如果您提供不帶日期元件的時間字串,則 TO_TIMESTAMP 提供當年 01–01(1 月 1 日)的日期。

可以為輸入 date_string 提供任何型別的日期和時間字串。每個 date_string 字元必須對應于格式字串,但以下情況除外:

  • 可以包含或省略前導零(不帶分隔符的 date_string 除外)。
  • 年份可以用兩位數或四位數字指定。
  • 月份縮寫(採用 MON 格式)必須與該區域設定的月份縮寫相匹配。對於某些語言環境,月份縮寫可能不是月份名稱的初始連續字元。月份縮寫不區分大小寫。
  • 月份名稱(格式為 MONTH)應指定為完整的月份名稱。但是,TO_TIMESTAMP 不需要格式為 MONTH 的完整月份名稱;它接受完整月份名稱的初始字元,並選擇月份列表中與該初始字母序列相對應的第一個月。因此,在英語中,“J” = “January”,“Ju” = “June”,“Jul” = “July”。指定的所有字元必須與完整月份名稱的連續字元匹配;不檢查完整月份名稱之外的字元。例如,“Fe”“Febru”“FebruaryLeap”都是有效值; “Febs”不是有效值。月份名稱不區分大小寫。
  • 可以使用為語言環境定義的時間分隔符輸入時間值。輸出時間戳始終表示帶有 ODBC 標準時間分隔符的時間值:冒號 (:) 表示小時、分鐘和秒,句點 (.) 表示小數秒。省略的時間元素預設為零。預設情況下,返回的時間戳不帶小數秒。

格式化

格式是根據以下規則指定的一個或多個格式元素的字串:

  • 格式元素不區分大小寫。
  • 幾乎任何順序或數量的格式元素都是允許的。
  • 格式字串使用與 date_string 中的分隔符匹配的非字母數字分隔符(例如,空格、斜槓或連字元)分隔它們的元素。這些分隔符不會出現在使用標準時間戳分隔符的輸出字串中:連字元表示日期值,冒號表示時間值,句點(如果需要)表示小數秒。這種分隔符的使用不依賴於為您的 NLS 語言環境定義的 DateSeparator
  • 以下日期格式字串不需要分隔符:MMDDYYYYDDMMYYYYYYYYMMDDHHMISSYYYYMMDDHHMIYYYYMMDDHHYYYYMMDDYYYYDDMMHHMISSHHMI。還支援不完整的日期格式 YYYYMM,並假定 DD 值為 01。請注意,在這些情況下,必須為所有元素(例如 MMDD)提供前導零,但最後一個元素除外。
  • 格式中不是有效格式元素的字元將被忽略。

格式元素

下表列出了 format 引數的有效日期格式元素:

ElementMeaning
DD兩位數的月份日期 (01-31)。不需要前導零,除非格式不包含日期分隔符。
MM兩位數的月份編號(01-12;01 = 一月)。除非格式不包含日期分隔符,否則不需要前導零。在日語和中文中,月份數由一個數字組成,後跟“月份”的表意文字。
MON月份的縮寫名稱,由當前語言環境中的 MonthAbbr 屬性指定。預設情況下,在英文中,這是月份名稱的前三個字母。在其他語言環境中,月份縮寫可能超過三個字母長和/或可能不包含月份名稱的第一個字母。不允許使用句點字元。不區分大小寫。
MONTH月份的全名,由當前語言環境中的 MonthName 屬性指定。不區分大小寫。
YYYY四位數年份。
YY年份的最後兩位數。 YY 2 位數年份的前 2 位數預設為 19。
RR / RRRR兩位數年份到四位數年份的轉換。 (見下文。)
DDD一年中的一天。自 1 月 1 日以來的天數。(見下文。)
HH小時,指定為 01–12 或 00–23,具體取決於是否指定了子午線指示符(AM 或 PM)。可以指定為 HH12 或 HH24。
MI分鐘,指定為 00–59。
SS其次,指定為 00–59。
FF一秒鐘的分數。 FF 表示提供一個或多個小數位; date_string 可以指定任意數量的小數位數。 TO_POSIXTIME 準確返回六位精度,無論 date_string 中提供的精度如何。
AM / PM子午線指示器,指定 12 小時制。 (見下文。)
A.M. / P.M.子午線指示器(帶句點)指定 12 小時制。 (見下文。)

TO_TIMESTAMP 格式還可以包括 D(星期幾號)、DY(星期幾縮寫)或 DAY(星期幾名稱)元素以匹配輸入的 date_string。但是,這些格式元素未經過驗證或用於確定返回值。

兩位數年份轉換(RR RRRR 格式)

RR 格式提供兩位數到四位數的年份轉換。此轉換基於當年。如果當前年份在上半世紀(例如,2000 年到 2050 年),則從 00 到 49 的兩位數年份擴充套件到當前世紀的四位數年份,從 50 到 2 位數的年份99 年擴大到上個世紀的四位數年份。如果當前年份在世紀下半葉(例如,2050 年到 2099 年),則所有兩位數年份都將擴充套件為當前世紀中的四位數年份。將兩位數年份擴充套件到四位數年份如下例所示:

SELECT TO_TIMESTAMP('29 September 00','DD MONTH RR'),
       TO_TIMESTAMP('29 September 18','DD MONTH RR'),
       TO_TIMESTAMP('29 September 49','DD MONTH RR'),
       TO_TIMESTAMP('29 September 50','DD MONTH RR'),
       TO_TIMESTAMP('29 September 77','DD MONTH RR')
       
2000/9/29 0:00:00	2018/9/29 0:00:00	2049/9/29 0:00:00	1950/9/29 0:00:00	1977/9/29 0:00:00

RRRR 格式允許您輸入兩位數和四位數字的混合年份。四位數年份不變(與 YYYY 相同)。使用 RR 格式演算法將兩位數年份轉換為四位數年份。這在以下示例中顯示:

SELECT TO_TIMESTAMP('29 September 2018','DD MONTH RRRR')AS FourDigit,
       TO_TIMESTAMP('29 September 18','DD MONTH RRRR') AS TwoDigit,
       TO_TIMESTAMP('29 September 1949','DD MONTH RRRR') AS FourDigit,
       TO_TIMESTAMP('29 September 49','DD MONTH RRRR') AS TwoDigit,
       TO_TIMESTAMP('29 September 1950','DD MONTH RRRR') AS FourDigit,
       TO_TIMESTAMP('29 September 50','DD MONTH RRRR') AS TwoDigit
       
2018/9/29 0:00:00	2018/9/29 0:00:00	1949/9/29 0:00:00	2049/9/29 0:00:00	1950/9/29 0:00:00	1950/9/29 0:00:00

一年中的某一天(DDD 格式)

可以使用 DDD 將一年中的某一天(自 1 月 1 日以來經過的天數)轉換為實際日期。格式字串 DDD YYYY 必須與由整數天數和四位數年份組成的相應 date_string 配對。 (與 DDD 一起使用時,兩位數的年份必須指定為 RR(而不是 YY)。)格式字串 DDD 預設為當前年份。經過的天數必須是 1 到 365 範圍內的正整數(如果 YYYY 是閏年,則為 366)。四位數年份必須在年份日期範圍內:0001 到 9999。(如果省略年份,則預設為當前年份。) DDD 和年份(YYYYRRRRRR)格式元素可以在任何命令;它們之間的分隔符是強制性的;此分隔符可以是空格。以下示例顯示了這一年中的一天的用法:

SELECT TO_TIMESTAMP('2018:160','YYYY:DDD')

2018/6/9 0:00:00

如果格式字元串同時包含 DDDDD 元素,則 DDD 元素占主導地位。這在以下示例中顯示,它返回 2008-02-29 00:00:00(不是 2008-12-31 00:00:00):

SELECT TO_TIMESTAMP('2018-12-31-60','YYYY-MM-DD-DDD')

2018/3/1 0:00:00

TO_TIMESTAMP 允許返回對應於一年中某一天的日期表示式。 TO_CHAR 允許返回與日期表示式對應的一年中的哪一天。

第一年之前的日期

TO_TIMESTAMPTO_POSIXTIME 可以表示追溯到 0001 年 1 月 1 日的日期。

TO_DATE 提供儒略日期格式,它可以表示追溯到公元前 4712 年 1 月 1 日的日期。儒略日期轉換將七位內部正整數值(儒略日計數)轉換為顯示格式或 ODBC 格式的日期。儒略日期不支援時間值。

12 小時制時間

  • date_string 時間值後跟“am”“pm”(沒有句點)。這些子午線指標不區分大小寫,可以附加到時間值後,也可以用一個或多個空格分隔。
  • 該格式遵循具有'a.m.''p.m.'元素(任一個)的時間格式,與時間格式分開一個或多個空格。例如:DD-MON-YYYY-HH:MI:SSFF P.M.此格式支援12小時時鐘日期串值,例如下午2:23,2:23:54.6pm,下午2:23:54,下午2:23:54和下午2:23:54(假設為上午)。子午線指標不區分大小寫。當使用帶有周期的子午線指示器時,必須將其與時間值分開一個或多個空格。

示例

以下嵌入式 SQL 示例以各種格式指定日期字串。第一個使用預設格式,其他指定格式。所有這些都將 date_string 轉換為 2018–06–29 00:00:00 的時間戳值:

/// d ##class(PHA.TEST.SQLFunction).ToTimestamp()
ClassMethod ToTimestamp()
{
	&sql(
		SELECT
			TO_TIMESTAMP('29 JUN 2018'),
			TO_TIMESTAMP('2018 Jun 29','YYYY MON DD'),
			TO_TIMESTAMP('JUNE 29, 2018','month dd, YYYY'),
			TO_TIMESTAMP('2018***06***29','YYYY***MM***DD'),
			TO_TIMESTAMP('06/29/2018','MM/DD/YYYY'),
			TO_TIMESTAMP('29/6/2018','DD/MM/YYYY')
		INTO :a,:b,:c,:d,:e,:f
	)
	if SQLCODE = 0 { 
		w !,a,!,b,!,c,!,d,!,e,!,f 
	} else { 
		w "SQLCODE error:",SQLCODE 
	}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).ToTimestamp()
 
2018-06-29 00:00:00
2018-06-29 00:00:00
2018-06-29 00:00:00
2018-06-29 00:00:00
2018-06-29 00:00:00
2018-06-29 00:00:00

以下示例指定 YYYYMM 日期格式。它不需要元素分隔符。 TO_TIMESTAMP 提供缺失的日期和時間值:

 SELECT TO_TIMESTAMP('201806','YYYYMM')
 
 2018/6/1 0:00:00

以下示例僅指定 HH:MI:SS.FF 時間格式。 TO_TIMESTAMP 提供缺失的日期值。在每種情況下,此示例都返回 2018-01-01 的日期(其中 2018 是當前年份):

SELECT TO_TIMESTAMP('11:34','HH:MI:SS.FF'),
       TO_TIMESTAMP('11:34:22','HH:MI:SS.FF'),
       TO_TIMESTAMP('11:34:22.00','HH:MI:SS.FF'),
       TO_TIMESTAMP('11:34:22.7','HH:MI:SS.FF'),
       TO_TIMESTAMP('11:34:22.7000000','HH:MI:SS.FF')
2022/1/1 11:34:00	2022/1/1 11:34:22	2022/1/1 11:34:22	2022/1/1 11:34:22	2022/1/1 11:34:22

請注意,小數秒完全按照指定傳遞,沒有填充或截斷。

以下示例顯示了一些其他方法來指定帶小數秒的時間格式:

SELECT TO_TIMESTAMP('113422.9678','HHMISS.FF'),
       TO_TIMESTAMP('9678.113422','FF.HHMISS'),
       TO_TIMESTAMP('9678.20170804113422','FF.YYYYMMDDHHMISS')
       
2022/1/1 11:34:22	2022/1/1 11:34:22	2017/8/4 11:34:22

TO_TIMESTAMP 的所有三個呼叫都返回一個 ODBC 格式的時間戳,其時間部分的值為 11:34:22.9678。對於前兩個,省略的日期部分預設為當年的 1 月 1 日;第三個提供日期部分值。