2012-03-15 132 views
0

所以我有一個程序,我目前正在調試的過程中,我已經縮小到這個選擇語句。爲什麼我得到相同的結果不同的列

注意:其中to_date(''),3300,5220表示來自參數的內容。

SELECT SHIFT_ID_PK, SHIFT_NAME_FK, 
     SHIFT_START_DAY, SHIFT_START_TIME, 
     SHIFT_END_DAY, SHIFT_END_TIME, 
     SITE_ID_FK, SHIFT_DAY_ID, 
     STARTOFFSET, ENDOFFSET, 
     TO_TIMESTAMP_TZ((TO_DATE('3/13/2012 7:00 ', 'mm/dd/yyyy HH:MI:SS am') - (3300/24/60)) + (STARTOFFSET/24/60), 'YYYY-MM-DD HH:MI:SS TZH:TZM') AS SHIFT_START_DATE, 
     TO_TIMESTAMP_tz((TO_DATE('3/14/2012 1:00 ', 'mm/dd/yyyy HH:MI:SS am') - (5220/24/60)) + (ENDOFFSET /24/60), 'YYYY-MM-DD HH:MI:SS TZH:TZM') AS SHIFT_END_DATE 
    from shift_tbl 
    WHERE 
     ENDOFFSET >= 3300 
    AND STARTOFFSET < 5220 
    order by shift_start_date asc, shift_end_date; 

現在是什麼,這是該做的,是採取這是一個時間戳參數和減去偏移值。

該值表示其中星期日的午夜= 0(所以,如果是週一午夜的偏移會= 1440),其在本週已經過去的分鐘數。

當從參數中減去偏移量時,您將得到一週的開始。然後,您可以從已經預先確定的表格中獲得偏移值,並將該值添加到本週的開頭以獲取時間戳。

這樣做是爲了得到班次的開始日期和結束日期。

現在

下面你會看到和示例結果集,將來自這個:

SHIFT_ID_PK SHIFT_NAME_FK SHIFT_START_DAY SHIFT_START_TIME SHIFT_END_DAY SHIFT_END_TIME SITE_ID_FK SHIFT_DAY_ID STARTOFFSET ENDOFFSET **SHIFT_START_DATE        SHIFT_END_DATE** 
6146  6206   3    23:00    4   7:00   2450  3   4260   4740  **11-MAR-13 11.00.00.000000000 PM -05:00  11-MAR-14 07.00.00.000000000 PM -05:00** 

我現在的問題是,我的shift_start_date和shift_end_date出來像這樣

SHIFT_ID_PK SHIFT_NAME_FK SHIFT_START_DAY SHIFT_START_TIME SHIFT_END_DAY SHIFT_END_TIME SITE_ID_FK SHIFT_DAY_ID STARTOFFSET ENDOFFSET **SHIFT_START_DATE        SHIFT_END_DATE** 
6146  6206   3    23:00    4   7:00   2450  3   4260   4740  **11-MAR-13 11.56.00.000000000 PM -05:00  11-MAR-13 11.56.00.000000000 PM -05:00** 
相同的值標有

**.....** 

是我講的價值觀

值。

我已經嘗試了幾個不同的事情來解決這個問題,但是我沒有做過任何工作,所以我想我只是缺少一些非常簡單的東西導致這個問題。

任何幫助或建議,非常感謝。謝謝。

+0

除非我遺漏了一些東西,兩種情況下的'shift_start_date'和'shift_end_date'值是不同的。所以我不確定我是否理解你認爲不正確的東西。 – 2012-03-15 21:46:52

+0

對不起,這是一個錯字。我得到的是現在正確顯示 – James213 2012-03-16 00:45:22

回答

4

TO_TIMESTAMP_TZ對於其第一個參數需要VARCHAR2;你通過它DATE。因此,在幕後,甲骨文正在對您的DATE進行隱式TO_CHAR轉換,導致您失去精度,原因是兩個原始不同的值相同。

首先嚐試圍繞你的DATE與明確的格式提供的TO_CHAR,然後通過TO_TIMESTAMP_TZ。例如:

SQL> VAR startoffset NUMBER 
SQL> VAR endoffset NUMBER 
SQL> EXEC :startoffset := 4260; :endoffset := 4740; 

PL/SQL procedure successfully completed. 

SQL> SELECT TO_TIMESTAMP_TZ(TO_CHAR((TO_DATE('3/13/2012 7:00 PM' 
    2         ,  'MM/DD/YYYY HH:MI AM') 
    3        - (3300/24/60)) 
    4        + (:startoffset/24/60) 
    5       ,  'YYYY-MM-DD HH24:MI:SS') 
    6   ,    'YYYY-MM-DD HH24:MI:SS TZH:TZM') AS shift_start_date 
    7 ,  TO_TIMESTAMP_TZ(TO_CHAR((TO_DATE('3/14/2012 1:00 AM' 
    8         ,  'MM/DD/YYYY HH:MI AM') 
    9        - (5220/24/60)) 
10        + (:endoffset /24/60) 
11       ,  'YYYY-MM-DD HH24:MI:SS') 
12   ,    'YYYY-MM-DD HH24:MI:SS TZH:TZM') AS shift_end_date 
13 FROM DUAL; 

SHIFT_START_DATE               SHIFT_END_DATE 
--------------------------------------------------------------------------- --------------------------------------------------------------------------- 
14-MAR-12 11.00.00.000000000 AM -05:00          13-MAR-12 05.00.00.000000000 PM -05:00 

SQL> 

希望這有助於。

相關問題