これに苦しんでいて、正しい答えを見つけることができないようですが、変換についての言及はたくさんありますが、具体的なことは何も機能していません。
データ型がfloatの時間を時間と分に変換する必要があります。つまり、13.50は13.30になります。 DBでは浮動小数点数として固定されているデータ型なので、変更できません。 DBはSQL Server 2008R2です
試しました:
cast(cast(floor(fdsViewTimesheet.perStandardHours) as
float(2))+':'+cast(floor(100*(
fdsViewTimesheet.perStandardHours - floor(fdsViewTimesheet.perStandardHours)))as
float(2)) as time) AS STANDARD_HOURS
しかし、エラーメッセージが表示されます"Explicit conversion from data type real to time is not allowed"
試しました as char
の代わりに as float
ですが、クエリがハングします。
何が悪いのですか?私はwant to convert a float value into hours and minutes
。誰かが私を正しい方向に向けることができれば感謝しています。
あなたが試すことができます:
DECLARE @HOURS decimal(7,4) = 20.5599
SELECT CAST(CONVERT(VARCHAR,DATEADD(SECOND, @HOURS * 3600, 0),108) AS TIME)
出力:20:33:35
しかし、覚えておいてください:MSSQLで時間を入力するのは24時間以内だけです
24時間以上必要な場合は、以下を試してください。
DECLARE @HOURS decimal(7,4) = 25.5599
SELECT
RIGHT('0' + CAST (FLOOR(@HOURS) AS VARCHAR), 2) + ':' +
RIGHT('0' + CAST(FLOOR((((@HOURS * 3600) % 3600) / 60)) AS VARCHAR), 2) + ':' +
RIGHT('0' + CAST (FLOOR((@HOURS * 3600) % 60) AS VARCHAR), 2)
出力:25:33:35
-アップデート
小数分から24時間以上
DECLARE @MINUTES decimal(7,4) = 77.9
SELECT
RIGHT('0' + CAST (FLOOR(COALESCE (@MINUTES, 0) / 60) AS VARCHAR (8)), 2) + ':' +
RIGHT('0' + CAST (FLOOR(COALESCE (@MINUTES, 0) % 60) AS VARCHAR (2)), 2) + ':' +
RIGHT('0' + CAST (FLOOR((@MINUTES* 60) % 60) AS VARCHAR (2)), 2);
出力:01:17:54
DECLARE @f FLOAT = 13.5;
SELECT CONVERT(TIME(0), DATEADD(MINUTE, 60*@f, 0));
または、hh:mm
文字列として:
SELECT CONVERT(CHAR(5), DATEADD(MINUTE, 60*@f, 0), 108);
値が24以上の場合は注意してください。
これはあなたのために働くはずです
DECLARE @f [real]
SET @f = 13.50
SELECT DATEADD(mi, (@f - FLOOR(@f)) * 60, DATEADD(hh, FLOOR(@f), CAST ('00:00:00' AS TIME)))
あなたは分に変換して、次のように00:00時間に追加してみてはいかがでしょうか。
DECLARE @c datetime
select @c = dateadd(mi,fdsViewTimesheet.perStandardHours*60,'00:00')
Timeのみのステートメントでそれを実行したい場合:
select CONVERT(TIME,dateadd(mi,fdsViewTimesheet.perStandardHours*60,'00:00') )
24時間を超える値がある場合、SQLの標準の日時型および時刻型はこれらを保持できません。彼らは24時間の範囲を保持することに制限されています。あなたがする必要があるのは、例えば次のように時間表現を文字列に保存することです:
select cast(floor(fdsViewTimesheet.perStandardHours) as varchar(10)) + ':' + cast(FLOOR( (fdsViewTimesheet.perStandardHours - floor(fdsViewTimesheet.perStandardHours))*60)as varchar(2))