日付/時刻の比較
日付、時刻、またはタイム・スタンプの値を、同じデータ・タイプの別の値、同じデータ・タイプの日時定数、またはそのデータ・タイプの値のストリング表現と比較することができます。 さらに、TIMESTAMP WITHOUT TIME ZONE の値は、TIMESTAMP WITH TIME ZONE の値と比較できます。
すべての比較は日時順に行われます。 つまり、0001 年 1 月 1 日からの時間の経過の大きい方が値が大きいということです。 時刻 24:00:00 は、時刻 00:00:00 より大きいものとして比較します。
TIME 値および時刻値のストリング表現が関係する比較には、秒も必ず含まれます。 ストリング表記で秒数を省略しているときは、暗黙のうちにゼロ秒が補われます。
タイム・スタンプ値を扱う比較は、次の規則に従って評価されます。
- 精度が異なるタイム・スタンプ値を比較する場合、より高い精度を使用して比較が行われます。 秒の小数部分の足りない数字は、ゼロであると見なされます。
- TIMESTAMP WITH TIME ZONE 値を TIMESTAMP WITHOUT TIME ZONE 値と比較する場合、比較を行う前に TIMESTAMP WITHOUT TIME ZONE 値は TIMESTAMP WITH TIME ZONE にキャストされます。
- 2 つの TIMESTAMP WITH TIME ZONE 値を比較する場合、それぞれの値の UTC 表現を使用して比較されます。 2 つの TIMESTAMP WITH TIME ZONE 値が UTC の同じインスタンスを表す場合、それらの値は等しいとみなされます (値に格納されているタイム・ゾーン・オフセットは無関係)。 例: '1999-04-15-08.00.00-08:00' (8:00 a.m. 太平洋標準時) は '1999-04-15-11.00.00-05:00' (11:00 a.m. 東部標準時) と同じです。
- タイム・スタンプ値をタイム・スタンプのストリング表現と比較する場合、最初にストリング表現がタイム・スタンプ・オペランドのデータ・タイプに変換されます。 ただし、変換される値の精度が 12 である場合は例外です。 タイム・スタンプ・オペランドが TIMESTAMP WITHOUT TIME ZONE である場合、ストリングにはタイム・ゾーンの指定を含めてはなりません。
- タイム・スタンプの比較は日時順に行われます。
等しいと見なしてよい表記については考慮されません。 例えば、以下の述部は真です。
TIMESTAMP('1990-02-23-00.00.00') > '1990-02-22-24.00.00'
例 1: 表 TABLE1 は 2 つの列を持っています。C1 は TIMESTAMP WITH TIME ZONE として定義され、C2 は TIMESTAMP WITHOUT TIME ZONE として定義されています。
CREATE TABLE TABLE1 (C1 TIMESTAMP WITH TIME ZONE, C2 TIMESTAMP);次の INSERT ステートメントを使用して、1 つの行が表に挿入されます。 入力値は、タイム・ゾーン付きのタイム・スタンプの文字ストリング表現で提供されます。INSERT INTO TABLE1 VALUES ( '2007-11-05-08.00.00-08:00', '2007-11-05-08.00.00');暗黙的なタイム・ゾーンが -5:00 とすると、次の SELECT ステートメントは行を戻しません。 TIMESTAMP WITHOUT TIME ZONE 値のストリング表現は TIMESTAMP WITH
TIME ZONE 値にキャストされ、この結果、列 C2 のタイム・ゾーン付きタイム・スタンプの値は '2007-11-05-08.00.00-05:00' になります。 2 つの値が等しくないため、比較述部は偽になります。SELECT 1 FROM TABLE1 WHERE C1 = C2;例 2: TIMESTAMP WITHOUT TIME ZONE 値を TIMESTAMP WITH TIME ZONE のストリング表現または TIMESTAMP WITHOUT TIME ZONE 値と比較する場合、ストリング表現は TIMESTAMP WITHOUT TIME ZONE にキャストされます (ストリングにタイム・ゾーンが含まれているかどうかは無関係)。 比較は、2 つの TIMESTAMP WITHOUT TIME ZONE 値を使用して実行されます。 string_hv が、タイム・ゾーン付きのタイム・スタンプの値
'2007-11-05-08.00.00-08:00' を含んでいるとします。 ストリング値は、TIMESTAMP WITHOUT TIME ZONE 値 '2007-11-05-08.00.00' にキャストされ、その値が列 C2 に格納されている値と比較されます。 タイム・ゾーン付きのタイム・スタンプの値 '2007-11-05-08.00.00' を持つ行が表に存在するため、次の SELECT ステートメントは単一行を戻します。SELECT 1 FROM TABLE1 WHERE C2 = :string_hv;