8

システムの稼働時間を秒単位で表す整数値を含むデータベース列があります。その稼働時間を読みやすい形式の日(秒)時間(秒)分(秒)で表示できるクエリが本当に欲しいのですが、その方法がよくわかりません。私が見つけた多くの例では、パラメーターを例として使用しているように見えますが、選択関数でパラメーターを使用する方法はあまりありません。

Webサイトに表示されているものと同じ時間も必要です。以前に 1 つのクエリを試してみたところ、日数が追加され、分が削除されました。誰でも私を助けることができますか?

ソースデータ:

PDT0014 6141
PDT0008 4990
PDT0024 840227
PDT0033 2301
PDT0035 5439
PDT0005 3434
PDT0019 5482

サンプルコード:

SELECT tblAssets.AssetName, 
(case when tblAssets.Uptime> (24*60*60) 
        then 
            cast(datepart(day,datediff(dd, 0, dateadd(second, tblAssets.Uptime, 0))) as varchar(4))
        +   ' Day(s) ' + convert(varchar(2), dateadd(second, tblAssets.Uptime, 0), 108) +' Hour(s)' 
    else
            convert(varchar(5), dateadd(second, tblAssets.Uptime, 0), 108) + ' Hour(s) Minute(s) ' 
    end) AS Uptime
FROM tblAssets

必要なクエリ出力:

PDT0014 01:42 Hour(s) Minute(s) 
PDT0008 01:23 Hour(s) Minute(s) 
PDT0024 10 Day(s) 17 Hour(s)
PDT0033 00:38 Hour(s) Minute(s) 
PDT0035 01:30 Hour(s) Minute(s) 
PDT0005 00:57 Hour(s) Minute(s) 
PDT0019 01:31 Hour(s) Minute(s)
4

5 に答える 5

12

必要な出力に応じて:

DECLARE @s INT = 139905;

SELECT                CONVERT(VARCHAR(12), @s /60/60/24) + ' Day(s), ' 
  +                   CONVERT(VARCHAR(12), @s /60/60 % 24) 
  + ':' + RIGHT('0' + CONVERT(VARCHAR(2),  @s /60 % 60), 2) 
  + ':' + RIGHT('0' + CONVERT(VARCHAR(2),  @s % 60), 2);

結果:

1 Day(s), 14:51:45

または:

DECLARE @s INT = 139905;

SELECT 
    CONVERT(VARCHAR(12), @s /60/60/24)   + ' Day(s), ' 
  + CONVERT(VARCHAR(12), @s /60/60 % 24) + ' Hour(s), '
  + CONVERT(VARCHAR(2),  @s /60 % 60)    + ' Minute(s), ' 
  + CONVERT(VARCHAR(2),  @s % 60)        + ' Second(s).';

結果:

1 Day(s), 14 Hour(s), 51 Minute(s), 45 Second(s).

などに置き換えることができ60/60/24ます86400が、/秒/分/時間の計算をそのままにしておくと、自己文書化が改善されることがわかります。また、テーブルに反対する場合はcolumn_name、の代わりに使用してください@s

于 2013-10-10T14:30:57.677 に答える
5

86400 で割ることにより、秒を日に変換できます。

3600 で割ることで秒を時間に変換できますが、余りを取得する必要があります (時間に変換された合計日数を差し引いて)。

60 で割って秒を分に変換できますが、残りを取得する必要があります (分に変換された合計時間を差し引いて)。

報告できるのは秒だけですが、分のように残りの秒のみを報告する必要があります (秒に変換された合計分を差し引くことにより)。

SELECT      FLOOR( UpTime / 86400 ) AS DAYS
        ,   FLOOR( ( UpTime / 3600 ) - FLOOR( UpTime / 86400 ) * 24 ) AS HOURS
        ,   FLOOR( ( UpTime / 60 ) - FLOOR( UpTime / 3600 ) * 60 ) AS MINUTES
        ,   UpTime - FLOOR( UpTime / 60 ) * 60 AS SECONDS
FROM        ( SELECT 269272 AS UpTime ) AS X

2692723 日 (259200 秒)、2 時間 (7200 秒)、47 分 (2820 秒)、52 秒を表します。

このクエリは以下を生成します。

| DAYS | HOURS | MINUTES | SECONDS |
------------------------------------
|    3 |     2 |      47 |      52 |

259200 を 125 (2 分 5 秒) に置き換えると、次のようになります。

| DAYS | HOURS | MINUTES | SECONDS |
------------------------------------
|    0 |     0 |       2 |       5 |

これを文字列表現に変換するには、SQL Server 2012 の FORMAT 関数を使用できます。

SELECT  CASE
            WHEN DAYS > 0 THEN
                FORMAT( DAYS, '##' ) + ' Day(s) ' + FORMAT( HOURS, '##' ) + ' Hour(s)'
            ELSE
                FORMAT( HOURS, '##' ) + ':' + FORMAT( MINUTES, '##' ) + ' Hour(s) Minute(s)'
        END AS UpTimeString
FROM (
    SELECT      FLOOR( UpTime / 86400 ) AS DAYS
            ,   FLOOR( ( UpTime / 3600 ) - FLOOR( UpTime / 86400 ) * 24 ) AS HOURS
            ,   FLOOR( ( UpTime / 60 ) - FLOOR( UpTime / 3600 ) * 60 ) AS MINUTES
            ,   UpTime - FLOOR( UpTime / 60 ) * 60 AS SECONDS
    FROM        ( SELECT 125 AS UpTime ) AS X
) AS UptimeSubselect
于 2013-10-10T14:30:28.143 に答える
2

これは、次を使用した別のアプローチDATEPART()です。

DECLARE @S INT = 86472,
        @START DATETIME = CONVERT(DATETIME,0)
DECLARE @END DATETIME = DATEADD(SECOND,@S, @START)

SELECT CONVERT(VARCHAR(10),DATEPART(DAY,@END)-1) + ' Day(s) ' +
       RIGHT(CONVERT(VARCHAR(10),100+DATEPART(HOUR, @END)),2) + ':' +
       RIGHT(CONVERT(VARCHAR(10),100+DATEPART(MINUTE, @END)),2) + ':' +
       RIGHT(CONVERT(VARCHAR(10),100+DATEPART(SECOND, @END)),2) 

時間部分をフォーマットする必要がない場合:

SELECT CONVERT(VARCHAR(10),DATEPART(DAY,@END)-1) + ' Day(s) ' +
       CONVERT(VARCHAR(10),DATEPART(HOUR, @END)) + '  Hour(s)' +
       CONVERT(VARCHAR(10),DATEPART(MINUTE, @END)) + ' Minute(s)' +
       CONVERT(VARCHAR(10),DATEPART(SECOND, @END)) + ' Second(s)'
于 2013-10-10T14:51:17.010 に答える