#sql #int #duration
Вопрос:
В базе данных SQL я делаю некоторые выборки, которые получают длительность (в результате вычитания между двумя датами) в секундах в виде int. Но я хочу отформатировать этот результат в удобочитаемой форме, например «чч:мм» или «дд:чч». Возможно ли это в SQL и как я могу это реализовать?
Ответ №1:
В SQL 2005 можно использовать следующее:
select convert(varchar(8), dateadd(second, [SecondsColumn], 0), 108)
Который сначала преобразует секунды в дату после 1900-01-01, а затем получает часть hh:mm:ss.
Если в столбце больше 24 часов, это перевернется, если вам нужны дни, а затем часы, в этом случае просто сделайте что-то вроде:
case when SecondsColumn> (24*60*60)
then
cast(datepart(day,datediff(dd, 0, dateadd(second, SecondsColumn, 0))) as varchar(4))
'd' convert(varchar(2), dateadd(second, SecondsColumn, 0), 108)
else
convert(varchar(8), dateadd(second, SecondsColumn, 0), 108)
end
Ответ №2:
Каждая база данных делает это по-разному. Я использую PostgreSQL, и он делает это так:
select to_char(my_date - my_other_date, 'HH:MM:SS');
Вам придется ознакомиться с руководством по используемой вами базе данных.
Комментарии:
1. Следующие работы: выберите to_char(интервал ‘1000s’,’HH24:MI:SS’); или выберите to_char(сейчас()-pg_postmaster_start_time(),»DDD «дней» HH24:MI:SS»);
Ответ №3:
Предполагая, что у вас есть несколько секунд:
DECLARE @DurationSeconds INT
-- 25h 45m 14s
SET @DurationSeconds = (25 * 3600) (45 * 60) (14)
SELECT
@DurationSeconds,
@DurationSeconds / 3600 hours,
@DurationSeconds % 3600 / 60 minutes,
@DurationSeconds % (3600 / 60) seconds
Я предоставлю вам задачу по хорошему форматированию. 🙂
Ответ №4:
Стандарта не существует, хотя многие СУБД имеют свой собственный синтаксис.
В целом, лучше выполнять работу по форматированию для удобства чтения человеком на уровне представления вашего приложения, а не где-либо рядом с базой данных.
Ответ №5:
В Oracle SQL:
-- 86,400 seconds in a day
-- 3,600 seconds in an hour
-- 60 seconds in a minute
select duration, -- seconds
trunc((duration)/86400) || ':' || -- dd
trunc(mod(duration,86400)/3600) || ':' || -- hh
trunc(mod(mod(duration,86400),3600)/60) || ':' || -- mm
mod(mod(mod(duration,86400),3600),60) -- ss
as human_readable
from dual
;