web-dev-qa-db-ja.com

SQL Serverの2つの日付時刻の差

SQLサーバーで2つのdatetimeの違いを取る方法はありますか?

たとえば、私の日付は

  1. 2010-01-22 15:29:55.090
  2. 2010-01-22 15:30:09.153

したがって、結果は14.063 secondsになります。

71
Jibu P C_Adoor

DateDiffについて追加する注意点は、ユニットとして指定した境界を通過する回数をカウントするため、正確なタイムスパンを探している場合は問題が発生する可能性があることです。例えば.

select datediff (m, '20100131', '20100201')

1から2月に境界を越えたため、答えは1となり、スパンが2日間であっても、datediffは1の値を返します-1つの日付の境界を越えました。

select datediff(mi, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')

再び値1を与え、分境界を1回通過したため、約14秒であっても、Minutesを単位として使用すると1分として返されます。

85
Andrew
SELECT DATEDIFF (MyUnits, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')

MSDNのDATEDIFF に基づいて「MyUnits」に置き換えます

24
gbn
SELECT  DATEDIFF(day, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')

dayを、secondminuteなどのように、差をつけたい他のユニットに置き換えます。

14
Quassnoi

非常に役立つMS SQL Serverの4つの重要な機能に言及できます。

1)関数 DATEDIFF() は、2つの日付の差を計算します。結果は、「year quarter month dayofyear day week hour分second millisecond microsecond nanosecond "、最初のパラメーターで指定(datepart):

select datediff(day,'1997-10-07','2011-09-11')

2)関数 GETDATE() を使用して、実際の時間を取得し、日付と実際の日付の差を計算できます。

select datediff(day,'1997-10-07', getdate() )

3)別の重要な関数は DATEADD() で、datediffの同じdatepartを使用してdatetimeの値を変換するために使用されます。 1つの基準日に追加(正の値で)または減算(負の値で)できること:

select DATEADD(day,  45, getdate()) -- actual datetime adding 45 days
select DATEADD(  s,-638, getdate()) -- actual datetime subtracting 10 minutes and 38 seconds

4)関数 CONVERT() は、必要に応じて日付をフォーマットするために作成されました。これはパラメトリック関数ではありませんが、結果の一部を使用して、必要に応じて結果をフォーマットできます。

select convert(  char(8), getdate() ,   8) -- part hh:mm:ss of actual datetime
select convert(  varchar, getdate() , 112) -- yyyymmdd
select convert( char(10), getdate() ,  20) -- yyyy-mm-dd limited by 10 characters

DATETIMEコールドは秒単位で計算され、これら4つの機能を組み合わせた興味深い結果の1つは、フォーマットされた差um時間、分、秒(hh:mm:ssを表示することです)2つの日付の間:

declare  @date1 datetime, @date2 datetime
set @date1=DATEADD(s,-638,getdate())
set @date2=GETDATE()

select convert(char(8),dateadd(s,datediff(s,@date1,@date2),'1900-1-1'),8)

...結果は00:10:38(638s = 600s + 38s = 10分38秒)

もう一つの例:

select distinct convert(char(8),dateadd(s,datediff(s, CRDATE , GETDATE() ),'1900-1-1'),8) from sysobjects order by 1
10
lynx_74

私はこの方法を試しましたが、うまくいきました。 SQL Serverバージョン2016を使用しました

SELECT DATEDIFF(MILLISECOND,'2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')/1000.00;

さまざまなDATEDIFF関数は次のとおりです。

SELECT DATEDIFF(year,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter,     '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month,       '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear,   '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day,         '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');

参照: https://docs.Microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017

6
rchacko

日付の違いを調べる方法はいくつかありますが、日付/時刻を比較するときはもっと多くの方法があります。 「HH:MM:SS」としてフォーマットされた2つの日付の差を取得するために使用するものは次のとおりです。

ElapsedTime AS
      RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate)        / 3600 AS VARCHAR(2)), 2) + ':'
    + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 /   60 AS VARCHAR(2)), 2) + ':'
    + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %   60        AS VARCHAR(2)), 2)

これを計算列に使用しましたが、UDFまたはクエリ計算として簡単に書き換えることができます。このロジックは、小数秒を切り捨てることに注意してください。 00:00.00〜00:00.999はゼロ秒と見なされ、「00:00:00」として表示されます。

期間が数日を超えることが予想される場合、このコードは必要に応じてD:HH:MM:SS形式に切り替わります。

ElapsedTime AS
    CASE WHEN DATEDIFF(S, StartDate, EndDate) >= 359999
        THEN
                          CAST(DATEDIFF(S, StartDate, EndDate) / 86400        AS VARCHAR(7)) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 86400 / 3600 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %  3600 /   60 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %    60        AS VARCHAR(2)), 2)
        ELSE
              RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate)        / 3600 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 /   60 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %   60        AS VARCHAR(2)), 2)
        END
5
user565869

SQL Serverでは、日付は2つの整数として保存されます。最初の整数は、基準日(1900/01/01)より前または後の日付の数です。 2番目の整数には、午前0時以降のクロックティック数が格納されます。各ティックは1/300秒です。

詳細はこちら

このため、日付を比較する最も簡単な方法は、単純に日付を減算することです。これは私のユースケースの90%を処理します。例えば。、

select date1, date2, date2 - date1 as DifferenceInDays
from MyTable
...

日以外の単位で回答が必要な場合は、 DateDiff を使用します。

5
RedFilter

次のクエリは、あなたが探している正確なものを与えるはずです。

select datediff(second, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')

ここに、datediff関数でできることのすべてに関するMSDNからのリンクがあります。 https://msdn.Microsoft.com/en-us/library/ms189794.aspx

4
Prateek

答えがDATEDIFF()に関係していることはわかっています。しかし、それはあなたが望むかもしれない結果の半分しか与えません。 2つのDATETIME値の間の分と秒の観点から、人間が読める形式で結果を取得したい場合はどうしますか?

CONVERT()DATEADD()、そしてもちろんDATEDIFF()関数は、クライアントが数字の代わりに使用できるより読みやすい結果に最適です。

つまり.

CONVERT(varchar(5), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114) 

これにより、次のようなものが得られます。

HH:MM

より正確にしたい場合は、VARCHAR()を増やすだけです。

CONVERT(varchar(12), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114) 

HH:MM.SS.MS

2
Fandango68
SELECT DATEDIFF(yyyy, '2011/08/25', '2017/08/25') AS DateDiff

の2つの日付の違いを示します

ここで(2017-2011)= 6結果

構文:

DATEDIFF(interval, date1, date2)
2
Abhishek Kanrar

Sol-1:

select 
  StartTime
  , EndTime
  , CONVERT(NVARCHAR,(EndTime-StartTime), 108) as TimeDiff 
from 
  [YourTable]

Sol-2:

select 
  StartTime
  , EndTime
  , DATEDIFF(hh, StartTime, EndTime)
  , DATEDIFF(mi, StartTime, EndTime) % 60 
from 
  [YourTable]

Sol-3:

select 
  DATEPART(hour,[EndTime]-[StartTime])
  , DATEPART(minute,[EndTime]-[StartTime]) 
from 
  [YourTable]

Datepartが最適に動作します

1
Lalitha Poluri

CREATE FUNCTION getDateDiffHours(@fdate AS datetime、@ tdate as datetime)RETURNS varchar(50)AS BEGIN DECLARE @cnt int DECLARE @cntDate datetime DECLARE @dayDiff int DECLARE @dayDiffWk int DECLARE @hrsDiff decimal(18)

DECLARE @markerFDate datetime
DECLARE @markerTDate datetime

DECLARE @fTime int
DECLARE @tTime int 


DECLARE @nfTime varchar(8)
DECLARE @ntTime varchar(8)

DECLARE @nfdate datetime
DECLARE @ntdate datetime

-------------------------------------
--DECLARE @fdate datetime
--DECLARE @tdate datetime

--SET @fdate = '2005-04-18 00:00:00.000'
--SET @tdate = '2005-08-26 15:06:07.030'
-------------------------------------

DECLARE @tempdate datetime

--setting weekends
SET @fdate = dbo.getVDate(@fdate)
SET @tdate = dbo.getVDate(@tdate)
--RETURN @fdate 

SET @fTime = datepart(hh,@fdate)
SET @tTime = datepart(hh,@tdate)
--RETURN @fTime 
if datediff(hour,@fdate, @tdate) <= 9

        RETURN(convert(varchar(50),0) + ' Days ' + convert(varchar(50),datediff(hour,@fdate, @tdate)))  + ' Hours'
else
--setting working hours
SET @nfTime = dbo.getV00(convert(varchar(2),datepart(hh,@fdate))) + ':' +dbo.getV00(convert(varchar(2),datepart(mi,@fdate))) + ':'+  dbo.getV00(convert(varchar(2),datepart(ss,@fdate)))
SET @ntTime = dbo.getV00(convert(varchar(2),datepart(hh,@tdate))) + ':' +dbo.getV00(convert(varchar(2),datepart(mi,@tdate))) + ':'+  dbo.getV00(convert(varchar(2),datepart(ss,@tdate)))

IF @fTime > 17 
begin
    set @nfTime = '17:00:00'
end 
else
begin
    IF @fTime < 8 
        set @nfTime = '08:00:00'
end 

IF @tTime > 17 
begin
    set @ntTime = '17:00:00'
end 
else
begin
    IF @tTime < 8 
        set @ntTime = '08:00:00'
end 



-- used for working out whole days

SET @nfdate = dateadd(day,1,@fdate) 

SET @ntdate = @tdate
SET @nfdate = convert(varchar,datepart(yyyy,@nfdate)) + '-' + convert(varchar,datepart(mm,@nfdate)) + '-' + convert(varchar,datepart(dd,@nfdate))
SET @ntdate = convert(varchar,datepart(yyyy,@ntdate)) + '-' + convert(varchar,datepart(mm,@ntdate)) + '-' + convert(varchar,datepart(dd,@ntdate))
SET @cnt = 0
SET @dayDiff = 0 
SET @cntDate = @nfdate
SET @dayDiffWk = convert(decimal(18,2),@ntdate-@nfdate)

--select @nfdate,@ntdate

WHILE @cnt < @dayDiffWk
BEGIN   
    IF (NOT DATENAME(dw, @cntDate) = 'Saturday') AND (NOT DATENAME(dw, @cntDate) = 'Sunday')
    BEGIN 
        SET @dayDiff = @dayDiff + 1
    END 
    SET @cntDate = dateadd(day,1,@cntDate)
    SET @cnt = @cnt + 1
END 

--SET @dayDiff = convert(decimal(18,2),@ntdate-@nfdate) --datediff(day,@nfdate,@ntdate)
--SELECT @dayDiff

set @fdate = convert(varchar,datepart(yyyy,@fdate)) + '-' + convert(varchar,datepart(mm,@fdate)) + '-' + convert(varchar,datepart(dd,@fdate)) + ' ' + @nfTime
set @tdate = convert(varchar,datepart(yyyy,@tdate)) + '-' + convert(varchar,datepart(mm,@tdate)) + '-' + convert(varchar,datepart(dd,@tdate)) + ' ' + @ntTime

set @markerFDate = convert(varchar,datepart(yyyy,@fdate)) + '-' + convert(varchar,datepart(mm,@fdate)) + '-' + convert(varchar,datepart(dd,@fdate)) + ' ' + '17:00:00'
set @markerTDate = convert(varchar,datepart(yyyy,@tdate)) + '-' + convert(varchar,datepart(mm,@tdate)) + '-' + convert(varchar,datepart(dd,@tdate)) + ' ' + '08:00:00'

--select @fdate,@tdate
--select @markerFDate,@markerTDate

set @hrsDiff = convert(decimal(18,2),datediff(hh,@fdate,@markerFDate))

--select @hrsDiff
set @hrsDiff = @hrsDiff +  convert(int,datediff(hh,@markerTDate,@tdate))

--select @fdate,@tdate  

IF convert(varchar,datepart(yyyy,@fdate)) + '-' + convert(varchar,datepart(mm,@fdate)) + '-' + convert(varchar,datepart(dd,@fdate)) = convert(varchar,datepart(yyyy,@tdate)) + '-' + convert(varchar,datepart(mm,@tdate)) + '-' + convert(varchar,datepart(dd,@tdate))  
BEGIN
    --SET @hrsDiff = @hrsDiff - 9
    Set @hrsdiff = datediff(hour,@fdate,@tdate)
END 

--select FLOOR((@hrsDiff / 9))

IF (@hrsDiff / 9) > 0 
BEGIN
    SET @dayDiff = @dayDiff + FLOOR(@hrsDiff / 9)
    SET @hrsDiff = @hrsDiff - FLOOR(@hrsDiff / 9)*9
END 

--select convert(varchar(50),@dayDiff) + ' Days ' + convert(varchar(50),@hrsDiff)   + ' Hours'

RETURN(convert(varchar(50),@dayDiff) + ' Days ' + convert(varchar(50),@hrsDiff))    + ' Hours'

終わり

1
George Hedley
declare @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12'

select CAST((@dt2-@dt1) as time(0))
1
Kash

以下のトリックをチェックして、2つの日付の日付の違いを見つけてください。

 DATEDIFF(DAY,ordr.DocDate,RDR1.U_ProgDate) datedifff

日または月または年または時間の差が必要な場合は、要件に応じて変更できます。

1
Bha15
select
datediff(millisecond,'2010-01-22 15:29:55.090','2010-01-22 15:30:09.153') / 1000.0 as Secs

result:
Secs
14.063

私はそれを言及すると思った。

1
Used_By_Already

これは私の答えではありませんが、このような質問をオンラインで検索しているときにこれを見つけました。この男は、時間、分、秒を計算する手順を設定しました。 link およびコード:

--Creating Function
If OBJECT_ID('UFN_HourMinuteSecond') Is Not Null
Drop Function dbo.UFN_HourMinuteSecond
Go
Exec(
'Create Function dbo.UFN_HourMinuteSecond
(
@StartDateTime DateTime,
@EndDateTime DateTime
) Returns Varchar(10) 
As
Begin

Declare @Seconds Int,
@Minute Int,
@Hour Int,
@Elapsed Varchar(10)

Select @Seconds = ABS(DateDiff(SECOND ,@StartDateTime,@EndDateTime))

If @Seconds >= 60 
Begin
select @Minute = @Seconds/60
select @Seconds = @Seconds%60

If @Minute >= 60
begin
select @hour = @Minute/60
select @Minute = @Minute%60
end

Else
Goto Final 
End

Final:
Select @Hour = Isnull(@Hour,0), @Minute = IsNull(@Minute,0), @Seconds =               IsNull(@Seconds,0)
select @Elapsed = Cast(@Hour as Varchar) + '':'' + Cast(@Minute as Varchar) + '':'' +     Cast(@Seconds as Varchar)

Return (@Elapsed)
End'
)
1
Jfabs

Books OnlineでDateDiffをチェックしてください。

1
Martin Clarke

DATEDIFFの印刷(second、 '2010-01-22 15:29:55.090'、 '2010-01-22 15:30:09.153')

1

DD:MM:SSにこれを使用:

SELECT CONVERT(VARCHAR(max), Datediff(dd, '2019-08-14 03:16:51.360', 
         '2019-08-15 05:45:37.610')) 
       + ':' 
       + CONVERT(CHAR(8), Dateadd(s, Datediff(s, '2019-08-14 03:16:51.360', 
         '2019-08-15 05:45:37.610'), '1900-1-1'), 8) 
0
user3777604

For Meこれは完全に機能しましたConvert(varchar(8)、DATEADD(SECOND、DATEDIFF(SECOND、LogInTime、LogOutTime)、0)、114)

出力はHH:MM:SSであり、私の場合は正確に表示されています。

0
clarifier