2016-06-14 5 views
-1

2番目の形式をhh:mm:ss形式に変換します。SQL Serverの100時間後に2番目のHH:MM:SSへの変換が正しくありません

create table #test (seconds bigint) 

insert into #test values ('359999') 

SELECT 
    seconds, 
    RIGHT('0' + CAST(seconds/3600 AS VARCHAR), 2) + ':' + 
    RIGHT('0' + CAST((seconds/60) % 60 AS VARCHAR), 2) + ':' + 
    RIGHT('0' + CAST(seconds % 60 AS VARCHAR), 2) AS [HH:MM:SS] 
FROM 
    #test 

結果:

Total_HandleTime_Sale  HH:MM:SS 
360000     00:00:00 

360000秒(100時間)後hh:mm:ssフォーマットは、これは私が使用していたコード00:00:00

にリセットされますしかし、私のアプリケーションでは、出力を次のようにする必要があります。

Total_HandleTime_Sale  HH:MM:SS 
360000     100:00:00 
+1

'RIGHT(VARCHAR AS '0' + CAST(秒/ 3600)、(CASE LEN(CASTは(秒'と(2、 '0' + CAST VARCHAR AS(秒/ 3600)) 'RIGHTを交換/ 3600 AS VARCHAR))> 2 THEN LEN(CAST(秒/ 3600 AS VARCHAR))ELSE 2 END) ' – mxix

+0

#test値に挿入する( '360000') –

答えて

2

RIGHT('0' + CAST(seconds/3600 AS VARCHAR),2)100値から1をトリミング - あなたは値が99

create table #test 
(seconds bigint) 

insert into #test values (360000), (359999) 

SELECT seconds, 
     CASE WHEN seconds/3600 < 100 THEN 
      RIGHT('0' + CAST(seconds/3600 AS VARCHAR),2) 
     ELSE 
      RIGHT('000' + CAST(seconds/3600 AS VARCHAR),3) 
     END + ':' + 
     RIGHT('0' + CAST((seconds/60) % 60 AS VARCHAR),2) + ':' + 
     RIGHT('0' + CAST(seconds % 60 AS VARCHAR),2) 
as [HH:MM:SS] FROM #test 

drop table #test 

結果その後、100より小さいか大きいかどうかをテストする必要があります。

seconds    HH:MM:SS 
-------------------- --------- 
360000    100:00:00 
359999    99:59:59 
1

まず、ドン」 t varcharをSQL Serverの長さ指定子なしで使用します。デフォルトの長さはコンテキストによって異なるため、これは危険です。あなたの表現で

、あなたがしている:

RIGHT('0' + CAST(seconds/3600 AS VARCHAR), 2) 

まあ、これは正確に2文字を取っています。だから "'' 100 '" - > "' 00 '"ここで

式を修正するための一つの方法である:

SELECT seconds, 
     (RIGHT('0' + CAST(seconds/3600 AS VARCHAR(255)), 3) + ':' + 
     RIGHT('0' + CAST((seconds/60) % 60 AS VARCHAR(255)), 2) + ':' + 
     RIGHT('0' + CAST(seconds % 60 AS VARCHAR(255)), 2) 
     ) as [HH:MM:SS] 
FROM #test; 

しかし、これはHHHHとして結果が得られます:MM:SS。そして、あなたは1000時間で同じ問題を抱えています。だから、これはあなたが望むものかもしれません:

SELECT seconds, 
     ((CASE WHEN seconds < 36000 
       THEN RIGHT('0' + CAST(seconds/3600 AS VARCHAR(255)), 2) 
       ELSE CAST(seconds/3600 AS VARCHAR(255)) 
      END) + ':' + 
     RIGHT('0' + CAST((seconds/60) % 60 AS VARCHAR(255)), 2) + ':' + 
     RIGHT('0' + CAST(seconds % 60 AS VARCHAR(255)), 2) 
     ) as [HH:MM:SS] 
FROM #test; 

これは、必要な時に余分な数字を追加します。

0
declare @seco int 
set @seco=370000 
select CONVERT(VARCHAR,@seco/60/60)+':'+RIGHT('00'+convert(varchar,@seco/60%60),2)+':'+RIGHT('00'+convert(varchar,@seco%60),2) 
関連する問題