説明
TO_POSIXTIME 関数は、さまざまな形式の日付/時刻文字列をデータ型 %Library.PosixTimeOpens in a new tab の %PosixTime タイムスタンプに変換します。TO_POSIXTIME は、64 ビットの符号付き整数としてエンコードされた 1970-01-01 00:00:00 の任意の開始ポイントからの経過秒数に基づいて計算された値として %PosixTime タイムスタンプを返します。この日付からの実際の経過秒数 (および秒の小数部) は、UNIX® タイムスタンプ (数値) です。InterSystems IRIS は、UNIX® タイムスタンプをエンコードして、%PosixTime タイムスタンプを生成します。%PosixTime タイムスタンプ値はエンコードされるため、1970-01-01 00:00:00 は 1152921504606846976 として示されます。1970-01-01 00:00:00 より前の日付は、負の整数値で示されます。詳細は、"%PosixTime データ型" を参照してください。
TO_POSIXTIME ではタイムゾーンは変換されません。ローカル日付とローカル時刻はローカル %PosixTime タイムスタンプに変換され、UTC 日付と UTC 時刻は UTC %PosixTime タイムスタンプに変換されます。
%PosixTime でサポートされる最初の日付は 0001-01-01 00:00:00 で、論理値 -6979664624441081856 を持ちます。サポートされる最後の日付は 9999-12-31 23:59:59.999999 で、論理値 1406323805406846975 を持ちます。これらの制限は、ODBC 日付形式の表示に関する制限に対応します。%Library.PosixTimeOpens in a new tab の MINVAL パラメータと MAXVAL パラメータを使用することで、これらの値をさらに制限できます。IsValid()Opens in a new tab メソッドを使用することで、数値が有効な %PosixTime 値であるかどうかを判定できます。
%PosixTime 値は、常に小数点以下 6 桁の精度の秒の小数部をエンコードします。%PosixTime の変換前、6 桁未満の精度の date_string は 6 桁になるように 0 が追加され、7 桁以上の精度の date_string は 6 桁に切り捨てられます。
date_string でタイムスタンプのコンポーネントを省略している場合、TO_POSIXTIME では不足コンポーネントを提供します。date_string と format の両方で年が省略されている場合、現在の年が yyyy の既定値として使用されます。date_string でのみ年が省略されている場合、00 が既定値として使用されますが、年の format 要素に従って 4 桁の年に拡張されます。日または月の値が省略されている場合、01 が dd の既定値として使用され、01-01 が mm-dd の既定値として使用されます。不足する時刻コンポーネントの既定値は 00 です。秒の小数部はサポートされていますが、明示的に指定する必要があります。既定では、秒の小数部は指定されません。
TO_POSIXTIME は、2 桁の年から 4 桁の年への変換をサポートしています。TO_POSIXTIME は、12 時間形式の時刻から 24 時間形式の時刻への変換をサポートしています。うるう年の検証も含めて、日付および時刻要素値の範囲の検証機能があります。範囲検証違反がある場合は、SQLCODE -400 エラーが生成されます。
この関数は、ObjectScript から TOPOSIXTIME()Opens in a new tab メソッド・コールを使用して呼び出すこともできます。
$SYSTEM.SQL.Functions.TOPOSIXTIME(date_string,format)
TO_POSIXTIME 関数は、フィールドに既定値を指定するときにデータ定義で使用することができます。以下はその例です。
CREATE TABLE mytest
(ID NUMBER(12,0) NOT NULL,
End_Year DATE DEFAULT TO_POSIXTIME('12-31-2018','MM-DD-YYYY') NOT NULL)
TO_POSIXTIME は、CREATE TABLE 文や ALTER TABLE ADD COLUMN 文で使用できます。このコンテキストでは、date_string にリテラル値のみを使用できます。詳細は、"CREATE TABLE" コマンドを参照してください。
%PosixTime の表現
%PosixTime は、date_string の精度に関係なく、6 桁の精度の秒の小数部をエンコードします。ODBC モードと表示モードでは、精度の末尾の 0 が切り捨てられます。
例
以下の埋め込み SQL の例では、現在のローカル日付/時刻を %PosixTime 値に変換しています (format では任意の小数桁数を示すのに "ff" が使用されます。この例では、3 桁の精度になります。%PosixTime は、末尾に 0 を 3 つ追加して、これを 6 桁の精度としてエンコードします)。この例では、次に %Posix LogicalToOdbc()Opens in a new tab メソッドを使用し、精度の末尾の 0 を削除して、この値を ODBC タイムスタンプとして表示しています。
SET tstime=$ZDATETIME($ZTIMESTAMP,3,1,3)
WRITE "local datetime in : ",tstime,!
&sql(SELECT
TO_POSIXTIME(:tstime,'yyyy-mm-dd hh:mi:ss.ff')
INTO :ptime)
IF SQLCODE=0 {
WRITE "Posix encoded datetime: ",ptime,!
SET ODBCout=##class(%PosixTime).LogicalToOdbc(ptime)
WRITE "local datetime out: ",ODBCout }
ELSE { WRITE "SQLCODE error:",SQLCODE }
以下の埋め込み SQL の例では、さまざまな形式で日付文字列を指定しています。最初の例では既定の形式を使用しており、それ以外の例では format を指定しています。これらはすべて、date_string をタイムスタンプ値 2018–06–29 00:00:00 に変換します。
&sql(SELECT
TO_POSIXTIME('29 JUN 2018'),
TO_POSIXTIME('2018 Jun 29','YYYY MON DD'),
TO_POSIXTIME('JUNE 29, 2018','month dd, YYYY'),
TO_POSIXTIME('2018***06***29','YYYY***MM***DD'),
TO_POSIXTIME('06/29/2018','MM/DD/YYYY'),
TO_POSIXTIME('29/6/2018','DD/MM/YYYY')
INTO :a,:b,:c,:d,:e,:f)
IF SQLCODE=0 { WRITE !,a,!,b,!,c,!,d,!,e,!,f }
ELSE { WRITE "SQLCODE error:",SQLCODE }
以下の例では、YYYYMM 日付形式を指定しています。これは要素セパレータを必要としません。TO_POSIXTIME では、不足している日付値と時刻値が補われます。
SELECT TO_POSIXTIME('201806','YYYYMM')
この例では、タイムスタンプ 2018–06–01 00:00:00 を返しています。
以下の例では、HH:MI:SS.FF 時刻形式のみを指定しています。TO_POSIXTIME では、不足している日付値が補われます。いずれの場合も、日付 2018–01–01 (2018 が現在の年の場合) が返されます。
SELECT TO_POSIXTIME('11:34','HH:MI:SS.FF'),
TO_POSIXTIME('11:34:22','HH:MI:SS.FF'),
TO_POSIXTIME('11:34:22.00','HH:MI:SS.FF'),
TO_POSIXTIME('11:34:22.7','HH:MI:SS.FF'),
TO_POSIXTIME('11:34:22.7000000','HH:MI:SS.FF')
秒の小数部は指定どおりに渡され、埋め込みや切り捨ては行われません。