Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

TO_DATE

フォーマットされた文字列を日付に変換する日付関数です。

Synopsis

TO_DATE(date_string[,format])

TODATE(date_string[,format])

引数

date_string 日付に変換される文字列。基本となるデータ型が CHAR または VARCHAR2 の文字列日付式。
format オプションdate_string に対応する日付形式文字列。format が省略されている場合、'DD MON YYYY' が既定値になります。この既定値は構成可能です。

概要

TO_DATETODATE は互換性があり、Oracle 互換性のためにサポートされています。

TO_DATE 関数は、さまざまな形式の日付文字列をデータ型 DATE の日付整数値に変換します。この関数は、さまざまな文字列形式で日付を入力し、その値を標準の内部表現で保存するために使用します。TO_DATE は日付を以下の形式で返します。

nnnnn

ここで、nnnnn は、0 (1840 年 12 月 31 日) から 2980013 (9999 年 12 月 31 日) までの正の整数です。これは日数を表します。時刻値は無視されます。

既定の最初の日付は 1840 年 12 月 31 日です。このドキュメントのリファレンスの "データ型" で説明されているように、負の整数が許容されるように DATE データ型の MINIVAL パラメータを変更すると、1840 年 12 月 31 日より前の日付を表すことができます。1840 年 12 月 31 日より前の日付は、後述のユリウス日付を使用して表現することもできます。

この関数は、ObjectScript から TODATE()Opens in a new tab メソッド呼び出しを使用して呼び出すこともできます。

$SYSTEM.SQL.TODATE(date_string,format)

TO_DATE 関数は、フィールドに既定値を指定するときにデータ定義で使用することができます。以下はその例です。

CREATE TABLE mytest
(ID NUMBER(12,0) NOT NULL,
End_Year DATE DEFAULT TO_DATE('31-12-2007','DD-MM-YYYY') NOT NULL)

この場合の TO_DATE の使用法の詳細は、"CREATE TABLE" コマンドを参照してください。

関連する SQL 関数

  • TO_DATE は、フォーマットされた日付文字列を日付整数に変換します。

  • TO_CHAR は、TO_DATE とは逆の操作を実行し、日付整数をフォーマットされた日付文字列に変換します。

  • TO_TIMESTAMP は、フォーマットされた日付/時刻文字列を標準のタイムスタンプに変換します。

  • CAST および CONVERT は、DATE データ型の変換を実行します。

Note:

前のバージョンの TO_DATE は、日付整数から文字列への変換をサポートしていましたが、現在では、この変換には TO_CHAR 関数を使用する必要があります。そのため、従来のアプリケーションを変更する必要がある場合があります。

日付文字列

最初の引数は日付文字列リテラルを指定します。date_string の入力にはどのような種類の日付文字列でも指定できます。各文字は、以下の例外を除いて format 文字列に対応している必要があります。

  • 区切り文字のない date_string の場合を除き、先頭のゼロは指定しても省略してもかまいません。

  • 年は 2 桁または 4 桁で指定できます。

  • 月名は、完全な名前または月名の最初の 3 文字で指定できます。正確に入力する必要があるのは最初の 3 文字のみです。月の名前では、大文字と小文字は区別されません。

  • 日付に追加された時刻の値は無視されます。

形式

2 番目の引数は、コード文字の文字列として日付形式を指定します。

既定の日付形式

format が指定されていない場合、TO_DATE は、既定の形式で日付文字列を解析します。出荷時の既定の形式は、DD MON YYYY です。例えば、'11 Nov 1993' です。

この既定の形式は、ObjectScript $SYSTEM.SQL.SetToDateDefaultFormat()Opens in a new tab クラス・メソッドを使用して構成可能です。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[TO_DATE() の既定の形式] の設定が表示されます。

形式の要素

format は、以下の規則に従って指定された 1 つまたは複数の形式要素の文字列です。

  • 形式要素では、大文字と小文字は区別されません。

  • ほとんど任意の数と順序で形式要素を使用できます。

  • 形式文字列は、date_string の区切り文字に一致する、英数字でない区切り文字 (スペース、スラッシュ、ハイフンなど) で要素を区切ります。この指定された日付区切り文字の使用は、NLS ロケールに対して定義されている DateSeparatorに依存しません。

  • MMDDYYYYDDMMYYYYYYYYMMDDYYYYDDMM の各日付形式文字列には、区切り文字は必要ありません。不完全な日付形式 YYYYMM も使用でき、DD 値は 01 と見なされます。ただし、このような場合、MM 値と DD 値の先頭にゼロを記述する必要があります。

以下のテーブルは、format 引数に対する有効な日付形式要素を示しています。

要素 意味
DD 2 桁の日付 (01 ~ 31)format に日付の区切り文字を記述している場合、各要素の先頭にゼロは不要です。
MM

2 桁の月数 (01 ~ 12、01 = 1 月)。format に日付の区切り文字を記述している場合、各要素の先頭にゼロは不要です。

日本語と中国語では、月数は数値とそれに続く表意文字 “月” で構成されます。

MON 現在のロケールの MonthAbbr プロパティによって指定される月の略名。既定で、これは英語による月名の最初の 3 文字です。その他のロケールでは、月名の略名が 4 文字以上になる場合や、月名の最初の数文字で構成されない場合があります。ピリオド文字の使用は認められていません。大文字と小文字は区別されません。
MONTH 現在のロケールの MonthName プロパティによって指定される正式な月名。大文字と小文字は区別されません。
YYYY 4 桁の年数
YY 下 2 桁の年数。2 桁の年数の最初の 2 桁は既定で 19 になります。
RR / RRRR 2 桁の年数から 4 桁の年数への変換(以下を参照)。
DDD 年間通算日。1 月 1 日からの日数 (以下を参照)。
J ユリウス日 (以下を参照)。

TO_DATE format には、D (曜日番号)、DY (曜日の省略形)、または DAY (曜日名) 要素を含めることもできます。ただし、これらの形式要素は、検証されることや戻り値の決定に使用されることはありません。これらの format 要素の詳細は、"TO_CHAR" を参照してください。

単一日付要素の日付形式

DD、DDD、MM、または YYYY を完全な日付形式として指定できます。これらの format 文字列は、月、年、または月と年の両方が省略されるため、Caché では、これらが現在の月および年を参照しているものと解釈されます。

  • DD は、現在年、現在月の指定日の日付を返します。

  • DDD は、現在年で、指定された日が 1 年のうちの何日目の日付であるかを返します。

  • MM は、現在年の指定された月の初日の日付を返します。

  • YYYY は、指定された年の現在月の初日の日付を返します。

これらの形式を、以下の埋め込み SQL の例で紹介します。

   NEW SQLCODE
   &sql(SELECT
        TO_DATE('300','DDD'),
        TO_DATE('24','DD')
      INTO :a,:b)
   IF SQLCODE=0 {
    WRITE "DDD format: ",a," = ",$ZDATE(a,1,,4),!
    WRITE "DD format: ",b," = ",$ZDATE(b,1,,4) }
   ELSE { WRITE "error:",SQLCODE }
   NEW SQLCODE
   &sql(SELECT
        TO_DATE('8','MM'),
        TO_DATE('2004','YYYY')
      INTO :a,:b)
   IF SQLCODE=0 {
    WRITE "MM format: ",a," = ",$ZDATE(a,1,,4),!
    WRITE "YYYY format: ",b," = ",$ZDATE(b,1,,4),!
    WRITE "done" }
   ELSE { WRITE "error:",SQLCODE }

2 桁の年の変換 (RR および RRRR 形式)

YY 形式では、2 桁の年の値に単に 19 が付加されて 4 桁の値に変換されます。したがって、07 は 1907 になり、93 は 1993 になります。

RR 形式では、2 桁の年から 4 桁の年への変換をより柔軟に行います。この変換は現在の年に基づきます。現在の年が、ある世紀の前半 (例えば 2000 ~ 2050 年) にある場合、00 ~ 49 までの 2 桁の年は現在の世紀の 4 桁の年に拡張され、50 ~ 99 までの 2 桁の年は前の世紀の 4 桁の年に拡張されます。現在の年が、ある世紀の後半 (例えば、2050 ~ 2099 年) にある場合、すべての 2 桁の年が現在の世紀の 4 桁の年に拡張されます。2 桁の年から 4 桁の年へのこの拡張の例を、以下の埋め込み SQL に示します。

   NEW SQLCODE
   &sql(SELECT 
       TO_DATE('29 September 00','DD MONTH RR'),
       TO_DATE('29 September 08','DD MONTH RR'),
       TO_DATE('29 September 49','DD MONTH RR'),
       TO_DATE('29 September 50','DD MONTH RR'),
       TO_DATE('29 September 77','DD MONTH RR')
      INTO :a,:b,:c,:d,:e)
   IF SQLCODE=0 {
    WRITE a," = ",$ZDATE(a,1,,4),!
    WRITE b," = ",$ZDATE(b,1,,4),!
    WRITE c," = ",$ZDATE(c,1,,4),!
    WRITE d," = ",$ZDATE(d,1,,4),!
    WRITE e," = ",$ZDATE(e,1,,4) }
   ELSE { WRITE "error:",SQLCODE }

RRRR 形式により、2 桁と 4 桁の年を混合して入力することができます。4 桁の年は変更されずに渡されます (YYYY と同じ)。2 桁の年は RR 形式アルゴリズムを使用して 4 桁の年に変換されます。以下は、この変換について示した埋め込み SQL の例です。

   NEW SQLCODE
   &sql(SELECT 
       TO_DATE('29 September 2008','DD MONTH RRRR'),
       TO_DATE('29 September 08','DD MONTH RRRR'),
       TO_DATE('29 September 1949','DD MONTH RRRR'),
       TO_DATE('29 September 49','DD MONTH RRRR'),
       TO_DATE('29 September 1950','DD MONTH RRRR'),
       TO_DATE('29 September 50','DD MONTH RRRR')
       INTO :a,:b,:c,:d,:e,:f)
   IF SQLCODE=0 {
    WRITE a," 4-digit = ",$ZDATE(a,1,,4),!
    WRITE b," 2-digit = ",$ZDATE(b,1,,4),!
    WRITE c," 4-digit = ",$ZDATE(c,1,,4),!
    WRITE d," 2-digit = ",$ZDATE(d,1,,4),!
    WRITE e," 4-digit = ",$ZDATE(e,1,,4),!
    WRITE f," 2-digit = ",$ZDATE(f,1,,4) }
   ELSE { WRITE "error:",SQLCODE }

年間通算日 (DDD 形式)

DDD を使用して、年間通算日 (1 月 1 日から経過した日数) を実際の日付に変換します。形式文字列 DDD YYYY は、整数の日数と 4 桁の年で構成される、対応する date_string と組み合わせる必要があります。(2 桁の年は、DDD と共に使用する場合は RR (YY ではない) として指定する必要があります)。形式文字列 DDD の既定は、現在の年となります。経過した日数は、1 ~ 365 の範囲の正の整数である必要があります (YYYY がうるう年の場合は 366)。4 桁の年は、Caché 標準の 1841 ~ 9999 の日付範囲にあることが必要です。DDD および YYYY の各形式要素は任意の順序で指定できますが、各要素間には区切り文字が必要です。以下の例は、この年間通算日の使用法を示しています。

   NEW SQLCODE
   &sql(SELECT TO_DATE('2008:60','YYYY:DDD')
        INTO :a)
   IF SQLCODE=0 {WRITE a," = ",$ZDATE(a,1,,4) }
   ELSE { WRITE "error:",SQLCODE }

形式文字列に DD と DDD 要素の両方が含まれる場合、DDD 要素が優勢です。以下の例に示すとおり、12/31/2008 ではなく 2/29/2008 が返されます。

   NEW SQLCODE
   &sql(SELECT TO_DATE('2008-12-31-60','YYYY-MM-DD-DDD')
        INTO :a)
   IF SQLCODE=0 {WRITE a," = ",$ZDATE(a,1,,4) }
   ELSE { WRITE "error:",SQLCODE }

TO_DATE では、年間通算日に対応する日付式を返すことができます。TO_CHAR では、日付式に対応する年間通算日を返すことができます。

ユリウス日 (J 形式)

Caché SQL では、ユリウス日は 1840 年 12 月 31 日よりも前の日付に使用できます。Caché はこの日を内部的に 0 として表示するため、それより前の日を表すには特殊な構文が必要です。TO_DATE は、この目的で 'J' (または 'j') の format を提供します。ユリウス日の変換は、7 桁の内部数値 (ユリウス日のカウント) を表示形式または ODBC 形式の日付に変換します。以下はその例です。

   NEW SQLCODE
   &sql(SELECT TO_DATE(2300000,'J')
        INTO :a)
   IF SQLCODE=0 {WRITE a }
   ELSE { WRITE "error:",SQLCODE }

上の例は、1585-01-31 (ODBC 形式) または 01/31/1585 (表示形式) という日付を返します。ユリウス日のカウント 1721424 は、1 年 1 月 1 日 (1–01–01) を返します。1709980 (皇帝アウグストゥスの統治するローマ帝国の誕生を決定づけたアクチウムの海戦) のようなユリウス日のカウントは BCE (紀元前) の日付を返します。この日付は、年の前にマイナス記号が付いて表示されます。

Note:

既定では、%Date データ型は 1840 年 12 月 31 日より前の日付を表しません。ただし、このデータ型の MINIVAL パラメータを再定義すると、それより前の日付を西暦 1 年 1 月 1 日まで、負の整数として表すことができます。この負の整数による日付の表記には、ここで説明する "ユリウス日" の日付形式とは互換性がありません。詳細は、このドキュメントのリファレンスの "データ型" を参照してください。

ユリウス日のカウントは常に内部的に 7 桁の数で表記され、必要に応じて先頭にゼロが付きます。TO_DATE では、先頭にゼロを付けずにユリウス日のカウントを入力できます。許可されている最大のユリウス日付は 5373484 で、12/31/9999 を返します。許可されている最小のユリウス日付は 0000001 で、01/01/-4712 (BCE 日付 01/01/-4713) を返します。この範囲外の値では、SQLCODE -400 エラーが発生します。生成される %msg の値は “[ユリウス日の値が無効です。ユリウス日は 1 と 5373484 の間でなければなりません]” になります。

Note:

以下の考慮事項は、TO_CHAR および TO_DATE の使用による日付とユリウス日のカウントの相互変換に影響を与えません。ただし、ユリウス日のカウントを使用して行う計算の一部には影響が及ぶ場合もあります。

1721424 (1/1/1) より前のユリウス日のカウントには、Oracle など、他のソフトウェア実装と互換性があります。このカウントは、通常の用法における BCE 日付と同一ではありません。通常の用法では、0 年は存在せず、日付の範囲は 12/31/-1 から 1/1/1 になります。Oracle の用法では、1721058 から 1721423 までのユリウス日は単純に無効となり、エラーが返されます。Caché では、ユリウス日がこの範囲内にあると、存在しない 0 年がプレースホルダとして返されます。したがって、BCE 日付を使用する計算は、1 年調整して通常の用法に対応させる必要があります。

また、これらの日付のカウントでは、グレゴリオ暦の導入 (1582 年 10 月に制定、ただし英国およびその植民地で採用されたのは 1752 年) による日付の変更が考慮されないことに注意してください。

TO_DATE では、ユリウス日のカウントに対応する日付式を返すことができます。TO_CHAR では、以下の例のように、日付式に対応するユリウス日のカウントを返すことができます。

SELECT 
  TO_CHAR('1776-07-04','J') AS JulianCount,
  TO_DATE(2369916,'J') AS JulianDate

既定の日付形式の例

以下の埋め込み SQL の例は、既定の日付形式を使用して解析される日付文字列を指定します。これらの文字列の両方は、60537 の DATE データ型内部値に変換されます。

  NEW SQLCODE
  &sql(SELECT 
       TO_DATE('29 September 2006'),
       TO_DATE('29 SEP 2006')
    INTO :a,:b)
  IF SQLCODE=0 {WRITE a,!,b }
   ELSE { WRITE "error:",SQLCODE }

以下の埋め込み SQL の例は、既定の format を使用した 2 桁の年で日付文字列を指定します。2 桁の年数が既定で 1900 ~ 1999 になっていることに注意してください。このため、内部 DATE 値は 24012 になります。

  NEW SQLCODE
  &sql(SELECT 
       TO_DATE('29 September 06'),
       TO_DATE('29 SEP 06')
    INTO :a,:b)
  IF SQLCODE=0 {WRITE a,!,b }
   ELSE { WRITE "error:",SQLCODE }

指定された日付形式の例

以下の埋め込み SQL の例は、さまざまな形式で日付文字列を指定します。これらの文字列のすべては、60810 の DATE データ型内部値に変換されます。

  NEW SQLCODE
  &sql(SELECT 
       TO_DATE('2007 Jun 29','YYYY MON DD'),
       TO_DATE('JUNE 29, 2007','month dd, YYYY'),
       TO_DATE('2007***06***29','YYYY***MM***DD'),
       TO_DATE('06/29/2007','MM/DD/YYYY')
    INTO :a,:b,:c,:d)
  IF SQLCODE=0 {WRITE !,a,!,b,!,c,!,d }
  ELSE { WRITE "error:",SQLCODE } 

以下の埋め込み SQL の例は、要素のセパレータを必要としない日付形式を指定します。これは、日付の内部値 60810 を返します。

  NEW SQLCODE
  &sql(SELECT 
       TO_DATE('06292007','MMDDYYYY'),
       TO_DATE('29062007','DDMMYYYY'),
       TO_DATE('20072906','YYYYDDMM'),
       TO_DATE('20070629','YYYYMMDD')
    INTO :a,:b,:c,:d)
  IF SQLCODE=0 {WRITE !,a,!,b,!,c,!,d }
  ELSE { WRITE "error:",SQLCODE }

以下の例は、YYYYMM 日付形式を指定します。これは要素セパレータを必要としません。欠落している日付要素には 01 を設定して、60782 (2007 年 6 月 1 日) という日付を返します。

   NEW SQLCODE
   &sql(SELECT TO_DATE('200706','YYYYMM')
        INTO :a )
   IF SQLCODE=0 {WRITE a," = ",$ZDATE(a,1,,4) }
   ELSE { WRITE "error:",SQLCODE }

関連項目

FeedbackOpens in a new tab