Почему я получаю одинаковый результат для разных столбцов - PullRequest
0 голосов
/ 16 марта 2012

Итак, у меня есть процедура, которую я сейчас нахожусь в процессе отладки, и я сузил ее до этого оператора выбора.

Примечание: где 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 Ответ

4 голосов
/ 16 марта 2012

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>

Надеюсь, это поможет.

...