2014-11-29 2 views
0

Прошло некоторое время с тех пор, как я опубликовал. У меня проблема с датами расчета.SQL Date Расчет форматирования

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

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

start = 12/11/2014 12:05:05 
finish = 13/11/2014 09:44:19 

то запрос дает мне -0,90224537 ......

Однако я требуется ответ в виде часов, минут, секунд для целей заработной платы. Каков наилучший способ сделать это?

Мой запрос до сих пор:

select 
    time_sheet.time_sheet_id, 
    time_sheet.start_date_time - time_sheet.finish_date_time,  
    employee_case.case, employee_case.employee 
from 
    time_sheet 
inner join 
    employee_case on time_sheet.employee_case = employee_case.employee_case_id 
where 
    employee_case.case = 1; 

P.S. Я использую базу данных Oracle :)

+0

Спасибо, что редактировали его правильно. @marc_s – DaRoGa

ответ

0

date - date дает разницу в days. Таким образом, вы можете использовать стандартное преобразование времени, чтобы преобразовать его в часы, минуты и секунды, как показано ниже:

select 
    time_sheet.time_sheet_id, 
    (time_sheet.finish_date_time - time_sheet.start_date_time)||' days'||(time_sheet.finish_date_time - time_sheet.start_date_time)*24||' hours '||(time_sheet.finish_date_time - time_sheet.start_date_time)*24*60||' minutes '||(time_sheet.finish_date_time - time_sheet.start_date_time)*24*60*60||' seconds ' ,  
    employee_case.case, employee_case.employee 
from 
    time_sheet 
inner join 
    employee_case on time_sheet.employee_case = employee_case.employee_case_id 
where 
    employee_case.case = 1; 

Кроме того, вам нужно будет finish_date_time как уменьшаемого и start_date_time как вычитаемого, чтобы избежать отрицательных значений.

+0

Это не работает так, как я хочу. Я, вероятно, не был ясно в моем вопросе. Я хочу, чтобы с учетом дат, о которых идет речь, ответ будет 21h 39m 14s, тогда как то, что вы дали, - это дать мне продолжительность в разных единицах, не разделенных между часами минут и секунд. извините за любую путаницу – DaRoGa

+0

Дараго, я понимаю. Я уверен, что есть какая-то функция где-то (возможно, не по умолчанию Oracle), которая показывает хороший читаемый формат, переведенный с «0,9» на «21h 39m 14s» (или что-то другое). Это не так просто, поскольку вы, вероятно, не хотите видеть это «0days 0h 39m 14s»? Что более удобно, чем «39 м 14 с» (при условии, что менее 1 часа). – tvCa

+0

@tvCa Вы абсолютно правы. Существует один: 'select numtodsinterval (2.7, 'Day') из double;' – toddlermenot

0

Спасибо за помощь toddlermenot, но я решил пойти другим путем, который я нашел. Для кого-либо другого, у кого есть такая же проблема, я сделал следующее:

select 
    time_sheet.time_sheet_id, 
    to_number(to_char(to_date('1','J') + 
    (time_sheet.finish_date_time - time_sheet.start_date_time), 'J') - 1) days, 
    to_char(to_date('00:00:00','HH24:MI:SS') + 
    (time_sheet.finish_date_time - time_sheet.start_date_time), 'HH24:MI:SS') time, 
    employee_case.case, employee_case.employee 
from 
    time_sheet 
inner join 
    employee_case on time_sheet.employee_case = employee_case.employee_case_id 
where 
    employee_case.case = 1; 

Это, кажется, делает именно то, что мне нужно. Он делает дни в поле serperate для часов минут и секунд, но для моих целей это приемлемо

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