所以我有一个程序,我目前正在调试过程中,我已将其缩小到这个选择语句。
注意: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 :(得分: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>
希望这有帮助。