web-dev-qa-db-ja.com

10進数の時間を時間と分に変換する

これに苦しんでいて、正しい答えを見つけることができないようですが、変換についての言及はたくさんありますが、具体的なことは何も機能していません。

データ型が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。誰かが私を正しい方向に向けることができれば感謝しています。

9
user1022772

あなたが試すことができます:

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

7
rcarvalhoxavier
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以上の場合は注意してください。

3
Aaron Bertrand

これはあなたのために働くはずです

DECLARE @f [real]
SET @f = 13.50

SELECT DATEADD(mi, (@f - FLOOR(@f)) * 60, DATEADD(hh, FLOOR(@f), CAST ('00:00:00' AS TIME)))
3
Matt Whitfield

あなたは分に変換して、次のように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))
1
Petio Ivanov