15

「時間」列を持つSQLServerテーブルがあります。このテーブルは、ステータスメッセージと各メッセージのタイムスタンプを格納するログテーブルです。ログテーブルは、バッチファイルを介して挿入されます。行をグループ化するID列があります。バッチファイルが実行されるたびに、IDが初期化され、レコードが書き込まれます。私がする必要があるのは、IDセットの最初のレコードから同じIDセットの最後のレコードまでの経過時間を取得することです。logTableからselectMax(Time)-Min(Time)をいじり始めましたが、id =ですが、正しくフォーマットする方法がわかりませんでした。HH:MM:SSで必要です。

4

8 に答える 8

16

更新しました:

24時間を超える場合でも、SQLServerでタイムスパンを正しく計算します。

-- Setup test data
declare @minDate datetime = '2012-12-12 20:16:47.160'
declare @maxDate datetime = '2012-12-13 15:10:12.050'

-- Get timespan in hh:mi:ss
select cast(
        (cast(cast(@maxDate as float) - cast(@minDate as float) as int) * 24) /* hours over 24 */
        + datepart(hh, @maxDate - @minDate) /* hours */
        as varchar(10))
    + ':' + right('0' + cast(datepart(mi, @maxDate - @minDate) as varchar(2)), 2) /* minutes */
    + ':' + right('0' + cast(datepart(ss, @maxDate - @minDate) as varchar(2)), 2) /* seconds */

-- Returns 18:53:24

不正確さを示すエッジケースは特に歓迎されます!

于 2012-12-13T19:58:12.517 に答える
13

SQL Serverは、SQL標準間隔データ型をサポートしていません。最善の策は、秒単位で差を計算し、関数を使用して結果をフォーマットすることです。間隔が24時間未満である限り、ネイティブ関数CONVERT()は正常に機能しているように見える場合があります。しかし、CONVERT()はこれに対する良い解決策ではありません。

create table test (
  id integer not null,
  ts datetime not null
  );

insert into test values (1, '2012-01-01 08:00');
insert into test values (1, '2012-01-01 09:00');
insert into test values (1, '2012-01-01 08:30');
insert into test values (2, '2012-01-01 08:30');
insert into test values (2, '2012-01-01 10:30');
insert into test values (2, '2012-01-01 09:00');
insert into test values (3, '2012-01-01 09:00');
insert into test values (3, '2012-01-02 12:00');

値は、

  • id = 1、経過時間は1時間です
  • id = 2、経過時間は2時間、そして
  • id = 3、経過時間は3時間です。

このSELECTステートメントには、秒を計算する1つの列と、減算でCONVERT()を使用する列が含まれています。

select t.id,
       min(ts) start_time,
       max(ts) end_time,
       datediff(second, min(ts),max(ts)) elapsed_sec,
       convert(varchar, max(ts) - min(ts), 108) do_not_use
from test t
group by t.id;

ID  START_TIME                 END_TIME                   ELAPSED_SEC  DO_NOT_USE
1   January, 01 2012 08:00:00  January, 01 2012 09:00:00  3600         01:00:00
2   January, 01 2012 08:30:00  January, 01 2012 10:30:00  7200         02:00:00
3   January, 01 2012 09:00:00  January, 02 2012 12:00:00  97200        03:00:00

ID番号3の27時間の違いについて、誤解を招く「03:00:00」に注意してください。

SQLServerで経過時間をフォーマットする関数

于 2012-12-13T19:59:45.037 に答える
9
DECLARE @EndTime AS DATETIME, @StartTime AS DATETIME

SELECT @StartTime = '2013-03-08 08:00:00', @EndTime = '2013-03-08 08:30:00'

SELECT CAST(@EndTime - @StartTime AS TIME)

結果:00:30:00.0000000

必要に応じて結果をフォーマットします。

于 2015-02-04T18:59:18.363 に答える
3

最良かつ簡単な方法:

Convert(varchar, {EndTime} - {StartTime}, 108)

アンリが指摘したように。

于 2015-05-27T13:45:30.517 に答える
2

DATEDIFFを使用して、ミリ秒、秒、分、時間などの値を返します。

DATEDIFF(間隔、日付1、日付2)

間隔 必要-戻る時間/日付の部分。次のいずれかの値になります。

year, yyyy, yy = Year
quarter, qq, q = Quarter
month, mm, m = month
dayofyear = Day of the year
day, dy, y = Day
week, ww, wk = Week
weekday, dw, w = Weekday
hour, hh = hour
minute, mi, n = Minute
second, ss, s = Second
millisecond, ms = Millisecond

date1 、date2REQUIRED-間の差を計算するための2つの日付

于 2017-11-17T09:18:38.603 に答える
1

select convert(varchar, Max(Time) - Min(Time) , 108) from logTable where id=...

于 2012-12-13T19:29:11.920 に答える
1

これが役立つかどうかを確認してください。経過日数、時間数、分数、秒数の変数を設定できます。これを好みに合わせてフォーマットしたり、ユーザー定義関数に含めることができます。

注:DateDiff(hh、@ Date1、@ Date2)は使用しないでください。信頼できません!予測できない方法で丸めます

与えられた2つの日付...(サンプル日付:2日、3時間、10分、30秒の差)

declare @Date1 datetime = '2013-03-08 08:00:00'
declare @Date2 datetime = '2013-03-10 11:10:30'
declare @Days decimal
declare @Hours decimal
declare @Minutes decimal
declare @Seconds decimal

select @Days = DATEDIFF(ss,@Date1,@Date2)/60/60/24 --Days
declare @RemainderDate as datetime = @Date2 - @Days
select @Hours = datediff(ss, @Date1, @RemainderDate)/60/60 --Hours
set @RemainderDate = @RemainderDate - (@Hours/24.0)
select @Minutes = datediff(ss, @Date1, @RemainderDate)/60 --Minutes
set @RemainderDate = @RemainderDate - (@Minutes/24.0/60)
select @Seconds = DATEDIFF(SS, @Date1, @RemainderDate)    
select @Days as ElapsedDays, @Hours as ElapsedHours, @Minutes as ElapsedMinutes, @Seconds as ElapsedSeconds
于 2013-03-13T15:40:26.567 に答える
0

これが2つのタイムスタンプ間の正確な時刻を取得するのに役立つことを願っています

Create PROC TimeDurationbetween2times(@iTime as time,@oTime as time) 
As  
Begin  

DECLARE @Dh int, @Dm int, @Ds int ,@Im int, @Om int, @Is int,@Os int     

SET @Im=DATEPART(MI,@iTime)  
SET @Om=DATEPART(MI,@oTime)  
SET @Is=DATEPART(SS,@iTime)  
SET @Os=DATEPART(SS,@oTime)  

SET @Dh=DATEDIFF(hh,@iTime,@oTime)  
SET @Dm = DATEDIFF(mi,@iTime,@oTime)  
SET @Ds = DATEDIFF(ss,@iTime,@oTime)  

DECLARE @HH as int, @MI as int, @SS as int  

if(@Im>@Om)  
begin  
SET @Dh=@Dh-1  
end  
if(@Is>@Os)  
begin  
SET @Dm=@Dm-1  
end  

SET @HH = @Dh  
SET @MI = @Dm-(60*@HH)  
SET @SS = @Ds-(60*@Dm)  

DECLARE @hrsWkd as varchar(8)         

SET @hrsWkd = cast(@HH as char(2))+':'+cast(@MI as char(2))+':'+cast(@SS as char(2))          

select @hrsWkd as TimeDuration   

End
于 2013-09-18T13:16:49.420 に答える