質問
SQLデータベースでは、2つの日付を減算した結果としての期間をintとして秒単位で取得するいくつかの選択を行います。しかし、この結果を「hh:mm」や「dd:hh」のような人間が読める形式にフォーマットしたいのです。 SQLでそれは可能ですか?どのようにこれを実現できますか?
解決
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
他のヒント
データベースごとに異なる方法があります。私はPostgreSQLを使用していますが、次のようにします。
select to_char(my_date - my_other_date, 'HH:MM:SS');
使用しているデータベースのマニュアルを参照する必要があります。
秒があると仮定:
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
あなたにぴったりの書式設定を任せます。 :-)
標準はありませんが、多くのDBMSには独自のカスタム構文があります。
一般に、データベースの近くではなく、アプリケーションのプレゼンテーションレイヤーで人間が読みやすい形式で作業することをお勧めします。
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
;
所属していません StackOverflow