サーバ側ロジックでSQLを実行するとき、DATE型やTIME型カラムの操作方法を教えてください。

DATE型はInterSystems製品のデータ型の%Dateに、TIME型は%Timeに対応しています。
%Dateは、内部日付($Horologのカンマ区切り1番目)、%Timeは、内部時刻($Horologのカンマ区切り2番目)を登録するタイプであるため、サーバ側ロジックでは表示モードを切り替えない限り、内部(論理)形式の値が使用されます。
サーバ側ロジックで内部日付・時刻の表示形式を変更する方法は、操作方法により異なります。

以降の実行例では、SAMPLESネームスペースのSample.Personテーブルを使用して解説します。
(コマンド実行例はSELECT文で記載していますが、更新文に対しても同様に記述できます。)

(1) 埋め込みSQLを利用する場合
埋め込みSQLを利用して表示形式を切り替えるには、#sqlcomple select を使用します。
指定できる値は Logical(デフォルト)、Display、ODBC、Runtime があります。
詳細は下記ドキュメントページをご参照ください。

埋め込み SQL のコンパイルとマクロ・プリプロセッサ【IRIS】
埋め込み SQL のコンパイルとマクロ・プリプロセッサ

#sqlcompile select=ODBC
&sql(declare C1 Cursor for select ID,Name,DOB into :pid,:name,:dob from Sample.Person where ID<=5)
&sql(open C1)
for {
    &sql(fetch C1)
    if SQLCODE'=0 { quit }
   //表示例)1-Mastrolito,Susan T.-2013-01-01
    write pid,"-",name,"-",dob,!
}
&sql(close C1


(2) ダイナミックSQLを利用する場合
%SQL.Statementを利用したダイナミックSQLで表示形式を切り替えるには、%SelectModeプロパティを利用します。
設定できる値は以下の通りです。

 0 :論理モード
 1 :ODBCモード
 2 :表示モード

※このプロパティは%Execute()の実行前に設定している必要があります。
詳細は下記クラスリファレンスをご参照ください。

クラスリファレンス - %SQL.Statement【IRIS]】
クラスリファレンス - %SQL.Statement

SAMPLES>set sql="select ID,Name,DOB from Sample.Person where ID <= 5"
 
SAMPLES>set stmt=##class(%SQL.Statement).%New()
 
SAMPLES>set st=stmt.%Prepare(sql)
 
SAMPLES>set rset=stmt.%Execute()
 
SAMPLES>do rset.%Display()
ID      Name    DOB
1       Gallant,Yan N.  42146
2       Waal,Umberto G. 45359
3       Jenkins,Sam A.  37404
4       Marks,Milhouse B.       52043
5       Hernandez,Phyllis W.    64590
 
5 Rows(s) Affected
SAMPLES>


(3) クラスクエリを使用する場合
クラスクエリで表示形式を切り替えるには、Query定義のパラメータ:SELECTMODE を利用します。
指定できる値は、RUNTIME(デフォルト)、LOGICAL、DISPLAY、ODBCが設定できます。
定義例は以下の通りです。

Query NewQuery1() As %SQLQuery(SELECTMODE = "ODBC")
{
select ID,Name,DOB from Sample.Person where ID<=5
}


(4) 実行中プロセスに対して表示形式を切り替える方法
システムオブジェクト $SYSTEM.SQL.SetSelectMode()を利用して、カレントプロセスの表示形式を変更できます。
第1引数に 0(Logical)、1(ODBC)、2(Display)を指定します。
第2引数は、実行結果が%Statusで設定される参照渡しの引数です。
戻り値には、現在の表示モードの番号が返ります。
詳細は下記ドキュメントページをご参照ください。

InterSystems SQL の基礎 - データ表示オプション【IRIS】
CachéSQLの基礎_データ表示オプション

// デフォルトからODBC形式に変更
SAMPLES>set cm=$system.SQL.SetSelectMode(1,.st)
 
SAMPLES>set sql="select ID,Name,DOB from Sample.Person where ID <= 5"
 
SAMPLES>set stmt=##class(%SQL.Statement).%New()
 
SAMPLES>set st=stmt.%Prepare(sql)
 
SAMPLES>set rset=stmt.%Execute()
 
SAMPLES>do rset.%Display()
ID      Name    DOB
1       Gallant,Yan N.  1956-05-23
2       Waal,Umberto G. 1965-03-10
3       Jenkins,Sam A.  1943-05-30
4       Marks,Milhouse B.       1983-06-28
5       Hernandez,Phyllis W.    2017-11-03
 
5 Rows(s) Affected
SAMPLES>

※プロセスに対して表示形式を切り替えた後、各SQL実行方法で表示形式を変更した場合は、最後に指定した表示形式が採用されます。

(5) Cachéオブジェクトスクリプトの関数を使用して、表示形式を変換する方法
オブジェクトスクリプトの表示変換用関数を利用して、内部形式⇔表示形式の変換を行う方法もあります。

日付用関数では
 表示→内部形式 $ZDATEH(yyyymmdd,8) または、$ZDATE(yyyy-mm-dd,3)
 内部→表示形式 YYYYMMDDの結果を取得する場合:$ZDATE(+$Horolog,8)
YYYY-MM-DDの結果を取得する場合:$ZDATEH(+$H,3)

時間用関数では
 表示→内部形式 $ZTIMEH("HH:MM:SS")
 内部→表示形式 HH:MM:SS の結果を取得する場合:$ZTIMEH($piece($Horolog,",",2))

日付時刻を取り扱う $ZDATETIME()と$ZDATETIMEH()関数もあります。

日付用関数の詳細は下記ドキュメントページをご参照下さい。
ObjectScript関数【IRIS】
ObjectScript関数

SAMPLES>write $horolog
63895,34979
SAMPLES>write $ZDATE(+$horolog,8)  // yyyymmddの形式へ変換
20151209
SAMPLES>write $ZDATE(+$horolog,3)  // yyyy-mm-ddの形式へ変換
2015-12-09
SAMPLES>write $ZDATEH(20151209,8)  // yyyymmddから内部形式へ変換
63895
SAMPLES>write $ZDATEH("2015-12-09",3)  // yyyy-mm-ddから内部形式へ変換
63895
SAMPLES>write $ZTIME($piece($horolog,",",2))  // 内部形式から時刻への変換
09:44:16
SAMPLES>write $ZTIMEH("10:01:11")  // 表示時刻から内部形式への変換
36071
SAMPLES>write $ZDATETIME($horolog,8)  // $horologを利用した日付時刻の変換
20151209 09:45:15
SAMPLES>write $ZDATETIME($horolog,3)
2015-12-09 09:45:16
SAMPLES>

該当する製品: Caché, Ensemble, HealthShare/Caché Based, IRIS Data Platform, HealthShare/IRIS Based, IRIS for Health
関連トピック: TIMESTAMP型のフォーマットを教えてください。
関連トピック:リストコレクションを定義したプロパティに対するSQLアクセス方法を教えてください。
添付ファイル:

アンケートにご協力をお願いします
このトピックは参考になりましたか?
このトピックに関するお問い合わせ

FAQトップに戻る