为什么我得到相同的结果不同的列

问题描述:

所以我有一个程序,我目前正在调试的过程中,我已经缩小到这个选择语句。为什么我得到相同的结果不同的列

注意:其中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

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> 

希望这有助于。