Отображение правильного вычитания двух временных меток в режиме создания - PullRequest
0 голосов
/ 17 ноября 2011

При использовании обычной функции минус '-' между двумя временными метками, ответ, полученный от оракула, неверен.

Вот что я хочу сделать:

ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT='DD-MON-RR HH24:MI TZR';

Созданная таблица:

CREATE TABLE TEST (
   StartTime timestamp with time zone
  ,EndTime   timestamp with time zone
  ,Science   varchar2(7)
);

Я создаю тип данных столбца как отметку времени с часовым поясом. Это значение, которое я вставил:

INSERT INTO TEST 
VALUES('05-OCT-2013 01:00 +08:00'
      ,'05-OCT-2013 23:00 +06:00'
      ,'SCIENCE');

INSERT INTO TEST 
VALUES('05-OCT-2013 12:00 +08:00'
      ,'05-OCT-2013 15:00 -12:00'
      ,'Maths');

Попытка времени округления:

CREATE VIEW TESTRECRDS AS
SELECT (Extract(hour FROM(ENDTIME- STARTTIME)) || 'Hours' || 
Extract(minute FROM(ENDTIME- STARTTIME))>=60 Then (Extract(hour FROM(ENDTIME- STARTTIME)) + Extract(minute FROM(ENDTIME- STARTTIME))/60 ELSE 0 END || 'Minutes' AS DURATION,
Science
FROM Test;

Теперь у меня есть два вопроса относительно расчета и округления минут до ближайших часов. Сначала предположим, что конечное время составляет 1535 +0600, а начальное время - 01:50 +0800. Поэтому, когда я вычитаю конечное время - время начала: формула должна быть:

2135 - 0950 = 2085 - 0950
= 1135

Но если я использую свою успешную попытку ответа для вычисления, это не правильный точный ответ. Ответ оракула будет 15 часов 45 минут.

Ответы [ 3 ]

1 голос
/ 17 ноября 2011

В вашем последнем выражении CREATE VIEW вы пытаетесь умножить text, что не может работать:

SELECT To_Char(STARTTIME - ENDTIME, 'HH24:MI TZR')*24 AS DURATION

*24 работает с текстом to_char() return. Вы должны умножить интервал перед преобразованием в текст.


Вы определяете столбец Science varchar2(6), затем вставляете 'SCIENCE', слово из 7 букв?


Я также исправил синтаксическую ошибку в вашем операторе INSERT: отсутствует '.


О вашем комментарии:
«Я хотел бы вставить метку времени с часовым поясом при создании моих таблиц. Может ли тип данных DATE сделать это тоже?

Читайте о типах данных в руководстве .
Тип данных date не включает информацию о часовом поясе.


Если под «разницей в часовых поясах» вы подразумеваете разницу между модификаторами часовых поясов, используйте ее для расчета:

SELECT EXTRACT(timezone_hour FROM STARTTIME) AS tz_modifier FROM tbl

Ключевые слова здесь timezone_hour и timezone_minute. Прочитайте подробнее в руководстве .

Но имейте в виду, что эти цифры зависят от летнего времени и таких махинаций. Очень неопределенная территория!


Получить его в красивом формате - пример:

SELECT to_char((EXTRACT (timezone_hour FROM STARTTIME) * 60
              + EXTRACT (timezone_minutes FROM STARTTIME))
              * interval '1 min', 'HH:MI')

В PostgreSQL у вас будет более простой EXTRACT (timezone FROM STARTTIME), но я не думаю, что Oracle поддерживает это. Не могу проверить сейчас.


Вот простая демонстрация того, как вы можете округлять минуты до часов:

SELECT EXTRACT(hour FROM (ENDTIME - STARTTIME))
     + CASE WHEN EXTRACT(minute FROM (ENDTIME - STARTTIME)) >= 30 THEN 1 ELSE 0 END
FROM Test;
0 голосов
/ 17 ноября 2011

Я не уверен, какое число вы пытаетесь вычислить, но когда вы вычитаете две даты в Oracle, вы получаете разницу между датами в единицах дней, а не DATE тип данных

SELECT TO_DATE('2011-01-01 09:00', 'yyyy-mm-dd hh24:mi') - 
       TO_DATE('2011-01-01 08:00', 'yyyy-mm-dd hh24:mi') AS diff 
  FROM dual

      DIFF
----------
.041666667

В этом случае с 8:00 до 9:00 с интервалом в 0,41667 дней.Это не объект даты, это скалярное число, поэтому форматирование его как HH24: MI не имеет никакого смысла.

0 голосов
/ 17 ноября 2011

Для округления вам нужно сделать немного больше математики. Попробуйте что-то вроде:

TO_DATE (ROUND ((ENDTIME - STARTTIME) * 96) / 96, 'HH24: MI')

Разница между датами в днях. Умножение на 96 изменяет меру на четверть часа. Округлите, затем конвертируйте обратно в дни и отформатируйте. Возможно, было бы лучше использовать числовой формат для форматирования, в этом случае вы должны делить на 4 вместо 96.

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

...