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

时间:2012-03-15 21:29:27

标签: sql oracle plsql timestamp

所以我有一个程序,我目前正在调试过程中,我已将其缩小到这个选择语句。

  

注意: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**

标有

的值
 **.....**

是我正在谈论的价值观。

我已经尝试了几种不同的方法来解决这个问题,但是我所做的一切都没有用,所以我觉得我只是错过了一些非常简单的问题。

非常感谢任何帮助或建议。谢谢。

1 个答案:

答案 0 :(得分:4)

TO_TIMESTAMP_TZ期望第一个参数VARCHAR2;你传给它DATE。因此,在幕后,Oracle正在对您的TO_CHAR进行隐式DATE转换,导致您在其中失去精度,只要两个原来不同的值相同。

首先使用明确格式提供的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>

希望这有帮助。