为什么我得到相同的结果不同的列
问题描述:
所以我有一个程序,我目前正在调试的过程中,我已经缩小到这个选择语句。为什么我得到相同的结果不同的列
注意:其中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**
相同的值标有
**.....**
是我讲的价值观
值。
我已经尝试了几个不同的事情来解决这个问题,但是我没有做过任何工作,所以我想我只是缺少一些非常简单的东西导致这个问题。
任何帮助或建议,非常感谢。谢谢。
答
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>
希望这有助于。
除非我遗漏了一些东西,两种情况下的'shift_start_date'和'shift_end_date'值是不同的。所以我不确定我是否理解你认为不正确的东西。 – 2012-03-15 21:46:52
对不起,这是一个错字。我得到的是现在正确显示 – James213 2012-03-16 00:45:22