2012-01-10 93 views
4

我有一個直接使用ADO.NET的SQL生成器庫。我有一個大於或 - 等於運營商創建一個選擇查詢,等等的手段:帶有時區的Oracle DateTime查詢

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

我的問題是,{某個日期}是要始終處於UTC時區,但它是與TIMESTAMP(6)WITH TIME ZONE列的book.date_created列進行比較,該列不在UTC時區。

我可以執行查詢,但我的結果是關閉時區比較becuaes。我的查詢適用於所有日期爲date_created> = x的書籍,但返回的結果中的一些不大於x,因爲在爲時區減去5小時後,它們現在小於x。使用DateTime將返回的IDataRecord DateTime字段轉換爲UTC.SpecifyKind()

我可以形成我的查詢,以便它解釋UTC時區中的book.date_created嗎?

注:雖然我很想改變我的Oracle數據庫列不指定時區,換表的結構是不是我可以做的。

編輯: 目前,{某個日期}是一個SQL參數。它的支持數據類型是以UTC作爲時區的DateTime。作爲參數,它是一個TimestampWithTZ。該參數的值是一個DateTime,其類型也指定爲UTC。

更新: 這個問題似乎涉及到我的成績從IDataRecord設置。當我關閉DateTimes時,我使用DateTime.SpecifyKind()將它們置於UTC模式。問題是,日期時間以DateTimeKind.Unspecified出現。從未指定轉換爲UTC時,它只是刪除時區並聲明它是UTC,而不更改基礎值。我不確定如何將IDataRecord拉入TimeZone值。

+0

是定義爲一個日期,時間戳或時間戳與時區「的一些日期」變量?你能展示一些.net代碼嗎? – tbone 2012-01-10 13:57:22

+0

@tbone,請參閱上面的編輯。 – 2012-01-10 14:49:45

+1

我假設你正在使用Oracle的增強版ado.net(odp.net或ODAC),並且爲「某日期」使用OracleTimeStampTZ結構,對嗎?問題可能不是你如何存儲時間戳,而是你在.NET端進行比較(這就是爲什麼我要求一些.NET代碼的原因)。 – tbone 2012-01-10 15:26:29

回答

3

您需要使用FROM_TZ功能是一種把TIMESTAMP與TIME ZONE一個時間戳。例如,如果你知道你的變量是UTC時間(+0:00):

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

下面是一個示例腳本,顯示你描述(當地時區應設置爲+1:00)的行爲:

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

文森特,看我的編輯。它看起來像Oracle參數的oracle類型已經是TimestampWithTZ。 – 2012-01-10 14:57:19

+0

或者from_tz(...,'UTC')可以使用(而不是from_tz(...,'+0:00'))。 – anre 2015-03-12 13:38:04