日付/時刻文
Synopsis
{d 'yyyy-mm-dd'} {t 'hh:mm:ss[.fff]'} {ts 'yyyy-mm-dd [hh:mm:ss.fff]'} {ts 'mm/dd/yyyy [hh:mm:ss.fff]'} {ts 'nnnnn'}
概要
これらの文は ODBC の日付形式、時刻形式、またはタイムスタンプ形式の文字列を受け取り、それを対応する Caché の日付形式、時刻形式、またはタイムスタンプ形式に変換します。これらの文は、データ形式の決定と、値および範囲のチェックを行います。
{d 'string'}
{d 'string'} 日付文は、ODBC 形式の日付を検証します。この日付が有効である場合は、1840-12-31 以降の整数カウント値として、(論理モードで) Caché $HOROLOG 日付形式で格納します。Caché によって、既定の時刻値が追加されることはありません。
以下のように指定するとします。
-
無効な日付 (ODBC 形式でない日付やうるう年以外の 02-29 の日付など) : Caché は SQLCODE -146 エラー : “yyyy-mm-dd' は無効な ODBC/JDBC 日付値です” を生成します。
-
1840-12-31 より前の日付 : Caché は SQLCODE -146 エラーを生成します。
-
ODBC タイムスタンプ値 : Caché はタイムスタンプの日付部分と時刻部分の両方を検証します。両方が有効な場合は、日付部分のみが変換されます。日付と時刻のいずれかが無効な場合、システムは SQLCODE -146 エラーを生成します。
{t 'string'}
{t 'string'} 時刻文は、ODBC 形式の時刻を検証します。この時刻が有効である場合は、深夜 0 時以降の秒数の整数カウント値として、(論理モードで) 指定の小数部と共に Caché $HOROLOG 時刻形式で格納します。Caché 表示モードおよび ODBC モードでは、秒の小数部は表示されません。秒の小数部は、これらの表示形式から切り捨てられます。
以下のように指定するとします。
-
無効な時刻 (ODBC 形式でない時刻や 23 より大きな時間) : Caché は SQLCODE -147 エラー: “hh:mi:ss.fff' は無効な ODBC/JDBC 時刻値です” を生成します。
-
ODBC タイムスタンプ値 : Caché は SQLCODE -147 エラーを生成します。
{ts 'string'}
{ts 'string'} タイムスタンプ文は、日付/時刻を検証し、ODBC タイムスタンプ形式で返します。指定された秒の小数部が常に保持され、表示されます。また、{ts 'string'} タイムスタンプ文は、日付も検証し、時刻値 00:00:00 を指定して ODBC タイムスタンプ形式で返します。
以下のように指定するとします。
-
ODBC 形式の有効なタイムスタンプ : Caché は指定された値を変更せずに格納します。これは Caché のタイムスタンプ形式が ODBC タイムスタンプ形式と同じためです。
-
ロケールの既定の日付形式および時刻形式を使用した有効なタイムスタンプ (例、2/29/2004 12:23:46.77) : Caché は指定された値を ODBC 形式で格納して表示します。
-
無効なタイムスタンプ (うるう年以外で日付部分に 02-29 を指定したタイムスタンプや、時刻部分で 23 より大きな時間が指定されたタイムスタンプなど) : Caché は値として文字列 “error” を返します。
-
1840-12-31 より前の日付を指定したタイムスタンプ : Caché は値として文字列 “error” を返します。
-
有効な日付 (ODBC 形式またはロケール形式) で時刻指定なし : Caché は時刻値として 00:00:00 を追加してから、生成されたタイムスタンプを ODBC 形式で格納します。必要に応じて、先行のゼロが指定されます。例えば、2/29/2004 の場合は 2004-02-29 00:00:00 が返されます。
-
有効な $HOROLOG 整数日付 (0 ~ 2980013) : Caché は時刻値として 00:00:00 を追加してから、生成されたタイムスタンプを ODBC 形式で格納します。例えば、59594 の場合は 2004-02-29 00:00:00 が返されます。$HOROLOG 日付整数には、先行のゼロを使用できないことに注意してください。
-
形式は正しいが無効な日付 (ODBC 形式またはロケール形式) で時刻指定なし : Caché は時刻値として 00:00:00 を追加してから、指定に従って日付部分を格納します。例えば、02/29/2003 の場合は 02/29/2003 00:00:00 が返されます。1776-07-04 の場合は 1776-07-04 00:00:00 が返されます。
-
形式が正しくない無効な日付(ODBC 形式、ロケール形式、または $HOROLOG 形式) で時刻指定なし : Caché は文字列 “error” を返します。例えば、2/29/2003 (先行のゼロはなく、日付値は無効) の場合は、“error” が返されます。00234 (先行のゼロがある $HOROLOG) では、“error” が返されます。
詳細は、"Caché ObjectScript リファレンス" の "$HOROLOG" 特殊変数を参照してください。
例
次のダイナミック SQL の例は、ODBC 形式で指定された日付 (先行にゼロがある場合もない場合も) を検証し、$HOROLOG 相当値 59594 として格納します。この例では、%SelectMode 0 (論理) 値が表示されます。
SET myquery = 2
SET myquery(1) = "SELECT {d '2004-02-29'} AS date1,"
SET myquery(2) = "{d '2004-2-29'} AS date2"
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SelectMode=0
SET tStatus = tStatement.%Prepare(.myquery)
SET rset = tStatement.%Execute()
DO rset.%Display()
次のダイナミック SQL の例は、ODBC 形式で指定された時刻 (先行にゼロがある場合もない場合も) を検証し、$HOROLOG 相当値 43469 として格納します。この例では、%SelectMode 0 (論理) 値が表示されます。
SET myquery = 3
SET myquery(1) = "SELECT {t '12:04:29'} AS time1,"
SET myquery(2) = "{t '12:4:29'} AS time2,"
SET myquery(3) = "{t '12:04:29.00000'} AS time3"
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SelectMode=0
SET tStatus = tStatement.%Prepare(.myquery)
SET rset = tStatement.%Execute()
DO rset.%Display()
次のダイナミック SQL の例は、ODBC 形式で指定され、秒の小数部のある時刻を検証し、$HOROLOG 相当値 43469 として秒の小数部を追加して格納します。末尾のゼロは切り捨てられます。この例では、%SelectMode 0 (論理) 値が表示されます。
SET myquery = 3
SET myquery(1) = "SELECT {t '12:04:29.987'} AS time1,"
SET myquery(2) = "{t '12:4:29.987'} AS time2,"
SET myquery(3) = "{t '12:04:29.987000'} AS time3"
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SelectMode=0
SET tStatus = tStatement.%Prepare(.myquery)
SET rset = tStatement.%Execute()
DO rset.%Display()
次のダイナミック SQL の例は、いくつかの形式による時刻および日付の値を検証し、相当する ODBC タイムスタンプとして格納します。必要に応じて時刻値 00:00:00 が指定されます。この例では、%SelectMode 0 (論理) 値が表示されます。
SET myquery = 6
SET myquery(1) = "SELECT {ts '2011-02-14 01:43:38'} AS ts1,"
SET myquery(2) = "{ts '2011-02-14'} AS ts2,"
SET myquery(3) = "{ts '02/14/2011 01:43:38.999'} AS ts3,"
SET myquery(4) = "{ts '2/14/2011 01:43:38'} AS ts4,"
SET myquery(5) = "{ts '02/14/2011'} AS ts5,"
SET myquery(6) = "{ts '62136'} AS ts6"
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SelectMode=0
SET tStatus = tStatement.%Prepare(.myquery)
SET rset = tStatement.%Execute()
IF rset.%Next() {
WRITE rset.ts1,!
WRITE rset.ts2,!
WRITE rset.ts3,!
WRITE rset.ts4,!
WRITE rset.ts5,!
WRITE rset.ts6
}