C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQLServerでの時間計算の方法を教えてください

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■95297 / inTopicNo.1)  SQLServerでの時間計算の方法を教えてください
  
□投稿者/ ファイター (13回)-(2020/07/13(Mon) 08:31:03)

分類:[.NET 全般] 

int で与えられている ミリ秒データを
時:分:秒.ミリ秒
の形式にするにはどうすればよいのでしょうか?
引用返信 編集キー/
■95298 / inTopicNo.2)  Re[1]: SQLServerでの時間計算の方法を教えてください
□投稿者/ kiku (186回)-(2020/07/13(Mon) 08:46:48)
2020/07/13(Mon) 08:54:11 編集(投稿者)
No95297 (ファイター さん) に返信
> int で与えられている ミリ秒データを
> 時:分:秒.ミリ秒
> の形式にするにはどうすればよいのでしょうか?

            int test = 1001;//ミリ秒単位

            var ts1 = new TimeSpan(test * 10000);//100ナノ秒単位なので単位を合わせる
            var out1 = ts1.ToString();

            var ts2 = new TimeSpan(0, 0, 0, 0, test);
            var out2 = ts2.ToString();

SQLServerって書いてありますね。
見当違いの回答かもしれません。
申し訳ない。

引用返信 編集キー/
■95299 / inTopicNo.3)  Re[2]: SQLServerでの時間計算の方法を教えてください
□投稿者/ ファイター (14回)-(2020/07/13(Mon) 09:16:20)
No95298 (kiku さん) に返信

ありがとうございます。

SQLServer にこだわらず
C のやり方をそのまま
SQLServer に持っていくと

DECLARE @MSC INT = 69601097;

DECLARE @H INT = @MSC / 1000 / 60 / 60;
DECLARE @M INT = @MSC / 1000 / 60 % 60;
DECLARE @S INT = @MSC / 1000 % 60;
DECLARE @MS INT = @MSC % 1000;

SELECT CAST(@H AS VARCHAR) + ':' + CAST(@M AS VARCHAR) + ':' + CAST(@S AS VARCHAR) + '.' + CAST(@MS AS VARCHAR)

--結果
--19:20:1.97

DECLARE を使いまくるしかないんでしょうね。

引用返信 編集キー/
■95301 / inTopicNo.4)  (削除)
□投稿者/ -(2020/07/13(Mon) 09:49:43)
この記事は(投稿者)削除されました
引用返信 編集キー/
■95302 / inTopicNo.5)  Re[1]: SQLServerでの時間計算の方法を教えてください
□投稿者/ 魔界の仮面弁士 (2778回)-(2020/07/13(Mon) 09:51:39)
質問分類が「.NET 全般」のままになっていましたよ。


No95297 (ファイター さん) に返信
> int で与えられている ミリ秒データを
> 時:分:秒.ミリ秒
> の形式にするにはどうすればよいのでしょうか?

int の範囲は、-2,147,483,648 〜 2,147,483,647 ですね。

マイナス方向の時間を考慮するかどうかでも変わりますが、
0 以上のみを扱うとすると、最大値は
 24日20時間31分23秒647
になりますね。


「時:分:秒.ミリ秒」ではなく、全角コロンな
「時:分:秒.ミリ秒」となっていますが、これは意図的な物でしょうか?
下記では無視していますが、必要であれば最後に REPLACE を挟んでみてください。


-- とりあえず最大値でテスト
DECLARE @msec INT = 2147483647;

-- 適当な日付からの経過ミリ秒数を得る
DECLARE @time DATETIME2 = DATEADD(millisecond, @msec, CONVERT(DATETIME2, ' 2000/01/01 0:00:00.000'));

-- 変換例
DECLARE @timeTEXT VARCHAR(15)
= CONVERT(VARCHAR(3), @msec / (60 * 60 * 1000)) -- 24時間超過対策
+ SUBSTRING(CONVERT(NVARCHAR(13), @time, 114), 3, 10);  -- HH 部を捨てて、:mm:ss.fff 部を切り出す

-- 結果確認
SELECT @timeTEXT; -- 596:31:23:647
引用返信 編集キー/
■95304 / inTopicNo.6)  Re[3]: SQLServerでの時間計算の方法を教えてください
□投稿者/ 魔界の仮面弁士 (2780回)-(2020/07/13(Mon) 10:01:40)
No95299 (ファイター さん) に返信
> DECLARE @MSC INT = 69601097;
> --結果
> --19:20:1.97

結果が間違っていますね。
正しくは「19:20:01.097」です。

:1.97 という表記だと
:01.097 ではなく
:01.970 の意味になってしまいます。



> DECLARE を使いまくるしかないんでしょうね。
上記のように 24 時間を超えない範囲であるならば、こんな感じで。


DECLARE @MSC INT = 69601097;

DECLARE @timeTEXT VARCHAR(12) = CONVERT(VARCHAR(12), DATEADD(millisecond, @MSC, CONVERT(TIME, '00:00:00.000')), 114);

-- 結果確認
SELECT @timeTEXT; -- 19:20:01.097
引用返信 編集キー/
■95305 / inTopicNo.7)  Re[4]: SQLServerでの時間計算の方法を教えてください
□投稿者/ 魔界の仮面弁士 (2781回)-(2020/07/13(Mon) 10:33:25)
No95304 (魔界の仮面弁士) に追記
> :1.97 という表記だと
> :01.097 ではなく
> :01.970 の意味になってしまいます。

数値書式からの CONVERT や CAST だと、先頭ゼロ埋めも考慮する必要があります。

-- 秒未満を「小数秒」で表すなら、NUMERIC の方が手っ取り早いし融通が利くと思います
DECLARE @S NUMERIC(5, 3) = @MSC / 1000.000 % 60.000;

-- とはいえ、秒部を 2 桁でパディングする必要はありますので、
-- 最近の SQL Server なら、FORMAT 関数を使ってしまうのも手かと思います。
SELECT FORMAT(@S, N'00.000');



なお、24 時間未満なら、TIME 型 + FORMAT 関数が手っ取り早いです。

DECLARE @timeSpan TIME(3) = DATEADD(MILLISECOND, @MSC, CONVERT(TIME(3), '00:00:00.000'));
SELECT FORMAT(@timeSpan, N'hh\:mm\:ss\.fff');


いずれにしても、整形用の FUNCTION を自作しておくのが良いでしょうね。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ