2012-03-15 9 views
0

私は現在、私がデバッグの過程にいるという手続きを持っており、このselect文に絞っています。なぜ私は異なる列に対して同じ結果を得ているのですか?

注: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_start_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** 
のように同じ値として出てくる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.00.00.000000000 PM -05:00  11-MAR-14 07.00.00.000000000 PM -05:00** 

**.....** 

が付い

値は私が話していた値です。

私はこの問題を解決するためにいくつかの異なることを試みましたが、何もしていませんでしたので、私はこの問題の原因となっている非常に単純なものを見逃しています。

ご意見やご提案をいただければ幸いです。ありがとうございました。

+0

私が何かを逃していない限り、両方の場合の 'shift_start_date'と' shift_end_date'の値は異なります。だから私はあなたが間違っていると信じていることを理解しているかどうか分からない。 –

+0

申し訳ありませんが、それはタイプミスでした。私が得ていることが正しく表示されるようになりました – James213

答えて

4

TO_TIMESTAMP_TZは、最初のパラメータにはVARCHAR2が必要です。あなたはそれをDATEに渡しています。したがって、Oracleは暗黙のうちにDATEに暗黙のうちにTO_CHAR変換を実行しています。この変換では、最初は異なる2つの値が同じになるまで、精度が失われます。

は最初TO_TIMESTAMP_TZことを渡し、その後、明示的な形式で提供さTO_CHARであなたのDATEを取り巻く試してみてください。次のようなものがあります。

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> 

希望します。

関連する問題