2011-08-03 16 views
2

私はいくつかの日付の間の平均期間(DATETIME形式)を持っています。 1900-01-01 01:30.00.00。 DATETIMEを時間:分:秒の形式に変換するにはどうすればよいでしょうか。時間は24出力形式がVARCHAR以上になる可能性があります。時間単位のT-SQL継続時間:分:秒

IE。

1 days 12 hours 5 minutes convert to 36:05:00 
2 days 1 hour 10 minutes 5 seconds convert to 49:10:05 

等...

DECLARE @date1 DATETIME = '2011-08-03 13:30' 
DECLARE @date2 DATETIME = '2011-08-03 13:00' 
DECLARE @date3 DATETIME = '2011-08-03 14:00' 
DECLARE @abc DATETIME = '2011-08-03 12:00' 

select CAST(AVG(CAST([email protected] as float)) as datetime) 
from 
(
    select 'data' as label, @date1 as data 
union all 
select 'data' as label, @date2 as data 
union all 
select 'data' as label, @date3 as data 
) as a 
group by label 

私は、平均時間は1時間30分であることを意味1時30分00秒となり得るしたいと思います。

私はそれを試してみました:

CONVERT(VARCHAR(10), CAST(AVG(CAST([email protected] as float)) as datetime), 108) 

をその後私はHHで唯一の時間部分を取得:MM:SS。 @abc = 2011-08-02を設定すると、結果は同じになります - これは間違っています。

キングに関して、 マルチン

答えて

1
select cast(cast(cast(t as float) *24 as int) as varchar) + right(convert(varchar,t, 20), 6) 
from(
select cast(AVG(CAST([email protected] as float)) as datetime) t 
from 
( 
    select 'data' as label, @date1 as data 
union all 
select 'data' as label, @date2 as data 
union all 
select 'data' as label, @date3 as data 
) as a 
group by label 
) a 

結果:T-SQLで

1:30:00 
2

日時は正確に日付とそれが移動するので時間が24を超えることはできません時間、ということですそれは翌日に。 datepartを使用してdatetime値を取り出し、整数として扱い、必要な文字列に再結合することができます。最終的な目標に応じて、アプリケーションやプレゼンテーションレイヤーでこのタイプの作業を行うほうがよいかもしれませんが、より一般的な目的の言語では、より堅牢な日時ライブラリが必要な場合があります。

0

datetimeを非実数の日付と時刻に変換することはできません。

しかし、あなたはは、単にに時間文字列を連結することで、日時のように見えるという出力を得ることができます「:」分で、など

検索DATEADD()DATEDIFF()機能...

0

整数引数(秒単位の時間差)をとり、必要に応じてフォーマットするスカラー値関数を記述する必要があると思います。例えば、

CREATE FUNCTION intToDateTime (@time_in_secs BIGINT) RETURNS VARCHAR(30) 
AS 
BEGIN 
    DECLARE @retval VARCHAR(30); 
    SET @retval = cast(@time_in_secs/(60*60) as varchar(10))+':'+ 
    cast((@[email protected]_in_secs/(60*60)*3600)/60 as varchar(10))+':'+ 
    cast((@[email protected]_in_secs/(60)*60) as varchar(10)); 
return @retval; 
END 

この関数は、いくつかの変更を必要とする - あなたは0-9のための先行ゼロを表示したいことがあり、(i.g代わりに、この機能は現在、同じように「0」の「00」を。)より良い方法で負の値を処理する必要もあります。
DATEDIFF(second, @val1,@val2)と一緒に使用できます。
私はあなたに正しい方向を指摘したいと思います。

関連する問題