2012-01-10 5 views
4

私は、directly ADO.NETを使用するSQLビルダーライブラリを持っています。私の問題は、{いくつかの日付}は常にUTCタイムゾーンであることを行っているということですが、それだタイムゾーン付きOracle DateTimeクエリ

select * 
from book 
where book.date_created >= {some date} 

:ように私は、等しいより-大きいか、オペレータに選択クエリを作成する手段を持っていますTIMESTAMP(6)WITH TIME ZONE列のbook.date_created列と比較されます。これはUTCタイムゾーンには含まれません。

私はクエリを実行できますが、私の結果はタイムゾーンの比較のためにオフになっています。私のクエリは、date_created> = xとなっているすべての書籍のものですが、返される結果の一部は、タイムゾーンの5時間を引いた後にxより小さくなるため、xより大きくはありません。返されるIDataRecord DateTimeフィールドは、DateTime.SpecifyKind()を使用してUTCに変換されます。

UTCタイムゾーンでbook.date_createdを解釈するようにクエリを作成できますか?

注:Oracle DBの列を変更してタイムゾーンを指定したくないのですが、テーブル構造を変更することはできません。

編集: 現在、{some date}はSQLパラメータです。バックデータ型は、タイムゾーンとしてUTCを持つDateTimeです。パラメータとして、TimestampWithTZです。パラメータのValueは、UTCとして指定された種類のDateTimeです。

更新: この問題は、IDataRecordの結果セットに関連しているようです。 DateTimesをオフにすると、DateTime.SpecifyKind()を使用してDateTime.SpecifyKind()がUTCモードになります。問題は、DateTimeKind.Unspecifiedとして日付時刻が出てくることです。 UnspecifiedからUTCに変換するときは、タイムゾーンを削除し、基になる値を変更せずにUTCと宣言します。 IDataRecordをTimeZone値にプルする方法がわかりません。

+0

は、タイムゾーン付きの日付、タイムスタンプ、またはタイムスタンプとして定義される「some date」変数ですか?いくつかの.netコードを使用することができますか? – tbone

+0

@tbone、上記の編集を参照してください。 –

+1

私は、Oracleの拡張ADO.NET(odp.netまたはODAC)を使用していて、「日付」にOracleTimeStampTZ構造を使用していると仮定します。問題は、タイムスタンプをどのように格納するのかではなく、.NET側で比較していることです(.NETコードを要求した理由です)。 – tbone

答えて

3

あなたはTIME ZONE WITH TIMESTAMPにTIMESTAMPを変換FROM_TZ機能を使用する必要があります。

SELECT * 
    FROM book 
WHERE date_created >= from_tz(<timestamp>, '+0:00'); 

は、ここでは、(ローカルタイムゾーンが+1:00に設定する必要があります)を記述するの挙動を示すサンプルスクリプトです:

たとえば、あなたはあなたの変数はUTC時間(00 0)であることがわかっている場合
CREATE TABLE t (tz TIMESTAMP(6) WITH TIME ZONE); 
INSERT INTO t VALUES 
(to_timestamp_tz('20000101 00:00:00 +1:00','yyyymmdd hh24:mi:ss tzh:tzm')); 
INSERT INTO t VALUES 
(to_timestamp_tz('20000101 00:00:00 -1:00','yyyymmdd hh24:mi:ss tzh:tzm')); 

-- This will return two values instead of one 
SELECT * 
    FROM t 
WHERE tz >= to_timestamp('20000101 00:00:00', 'yyyymmdd hh24:mi:ss'); 

-- This query will return only one row 
SELECT * 
    FROM t 
WHERE tz >= from_tz (to_timestamp('20000101 00:00:00', 
            'yyyymmdd hh24:mi:ss'), '+0:00'); 
+0

Vincent、私の編集を参照してください。 OracleパラメータのOracleタイプがTimestampWithTZであるように見えます。 –

+0

from_tz(...、 '+0:00')の代わりにfrom_tz(...、 'UTC')を使用することもできます。 – anre

関連する問題