2010-10-25 3 views
1

Если у меня есть поле DateTime в таблице. Как я могу извлечь только время из строки, а затем вернуть значение смещения.SQL - время извлечения и смещение от него

Например, я хочу компенсировать полуночью. Поэтому, если время 00:45, я хочу значение 45. Если время 23:30, я хочу значение -30.

Спасибо.

+2

Почему -30? Когда ваша воображаемая формула переходит от положительной к отрицательной? – Fosco

+1

@Fosco. Потому что 23:30 30 минут * до полуночи. Не знаю, какой полуденный день вернется. – PaulG

+0

@PaulG :) Это моя точка ... недостаточно информации для создания точной формулы без предположений. – Fosco

ответ

0

Ok..assuming времени от 12 до 23 часов, как до полуночи и от 0 до 11 часов, как после полуночи, другими словами, как @Tony Эндрюс сказал полдень рассматривается как 720 минут до полуночи

Здесь другое решение -

SELECT (
    CASE 
    WHEN TO_CHAR(datetimefield,'HH24') BETWEEN 12 AND 23 
    THEN -1 * (60 * (12 - TO_CHAR(datetimefield,'HH')) - TO_CHAR(datetimefield,'MI')) 
    WHEN TO_CHAR(datetimefield,'HH24') BETWEEN 0 AND 11 
    THEN 60 * (TO_CHAR(datetimefield,'HH')) + TO_CHAR(datetimefield,'MI') 
    END) diff 
FROM (select systimestamp datetimefield from dual); 

Я использовал мой systemtimestamp для тестирования, Вам необходимо заменить запрос select systimestamp datetimefield from dual принести собственное поле DATETIME из таблицы, чтобы заставить его работать на вас.

5

Try:

(datecol - round(datecol))*24*60 

Например:

with times as 
(select trunc(sysdate) t from dual 
    union 
    select trunc(sysdate)+0.25 t from dual 
    union 
    select trunc(sysdate)+0.5 t from dual 
    union 
    select trunc(sysdate)+0.75 t from dual 
) 
select (t-round(t))*24*60 from times; 

0 
360 
-720 
-360 

Обратите внимание, что полуденное рассматривается как 720 минут до того полуночи.

+0

Спасибо. Отдам это. –

0

Список Oracle поддерживаемых форматов даты и времени, можно найти здесь: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm

Вы можете использовать эти форматы с функцией to_char - например:

select to_char(sysdate, 'mi') from dual 

Вы, кажется, выбрал путь представляя времена, которые не поддерживаются, но ответ Тони должен соответствовать вашим требованиям.

Смежные вопросы