2016-11-18 147 views
0

我使用以下SQL從一個時區隱蔽的日期/時間值,以從上述輸出的另一日期/時間轉換

from_tz(cast(to_date(to_char(q.created_date, 'DDMMYYYY:HH24:MI:SS'), 
    'DDMMYYYY:HH24:MI:SS') as timestamp), 'Europe/London') at time zone 'America/New_York' 
    else null end as Message_Rcd_Date_Time 

如下:

29-OCT -2016 14:28:16.000000 -04:00

我想要做的是輸出這個日期/時間如下所示,不包括時區,請告訴我爲了達到這個目的我需要改變什麼?

29-OCT-2016 14點28分十六秒

+1

您需要與期望的格式模型外TO_CHAR內包裝所產生的時間戳值:'TO_CHAR(FROM_TZ ....在時區..., 'DD-MON-YYYY HH24:MI:SS')否則返回null結束....' – mathguy

+1

然而,這使得只有本作的最終報告的意義,而不是中間處理。如果時間戳值被進一步使用(或者存儲回表格中),那麼您不應該擔心格式化,不要管它。 – mathguy

+0

「CREATED_DATE」列的數據類型是什麼? –

回答

0

首先,讓我們解散你的表達

FROM_TZ(CAST(TO_DATE(TO_CHAR(q.created_date, 'DDMMYYYY:HH24:MI:SS'), 'DDMMYYYY:HH24:MI:SS') AS TIMESTAMP), 'Europe/London') AT TIME ZONE 'America/New_York' 

並執行以下操作:

  1. TO_CHAR(q.created_date, 'DDMMYYYY:HH24:MI:SS') - >轉換created_dateVARCHAR2
  2. TO_DATE(..., 'DDMMYYYY:HH24:MI:SS') - >將其轉換回一個DATE
  3. CAST(... AS TIMESTAMP) - >將其轉換爲TIMESTAMP(無時區)
  4. FROM_TZ(..., 'Europe/London') - >附加的時區「歐洲/倫敦到它
  5. ... AT TIME ZONE 'America/New_York' - >轉換爲時間區域 '美國/紐約'

點1,2和3是無用!由於created_dateTIMESTAMP你能做到短

TO_CHAR(FROM_TZ(q.created_date, 'Europe/London') AT TIME ZONE 'America/New_York', 'DD-MON-YYYY HH24:MI:SS') 

如果您SESSIONTIMEZONEEurope/London你甚至可以讓

TO_CHAR(q.created_date AT TIME ZONE 'America/New_York', 'DD-MON-YYYY HH24:MI:SS') 
+0

優秀wernfried我喜歡簡化它的想法通過使其更短,工作也deshipred,謝謝 –

+0

我再次 - 我現在試圖找出2個時間戳之間的差異,但即時通訊錯誤,指出'無效數字'任何想法,爲什麼這可能是? TO_CHAR(FROM_TZ(min(q.created_date)over(partition by k.car_id,m.fll_id),'Europe/London')AT TIME ZONE'America/New_York','DD-MON-YYYY HH24:MI ') - TO_CHAR(min(m.act_onblk_datt_bu)over(partition by k.car_id,m.fll_id)AT TIME ZONE'America/New_York','DD-MON-YYYY HH24:MI')* 24 * 60) ||'-mins'的區別 –

+0

你不能從一個'character'中減去一個'character'。在整個結果周圍放置'TO_CHAR' ** **一次**。 –

0

不知道有關Oracle但低於查詢可以提供幫助。

SELECT SUBSTR((cast(to_date(to_char(q.created_date, 'DDMMYYYY:HH24:MI:SS'), 
     'DDMMYYYY:HH24:MI:SS') as timestamp), 'Europe/London') , 1, 20) at time zone 'America/New_York' 
    else null end as Message_Rcd_Date_Time; 

如果它本來SQL Server只LEFT功能會工作。

+0

這不起作用 –