wake-up-neo.net

Unterschied von zwei Datumszeiten in SQL Server

Gibt es eine Möglichkeit, den Unterschied zwischen zwei datetime im SQL-Server zu nehmen?

Zum Beispiel sind meine Termine

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

Das Ergebnis sollte also 14.063 seconds sein.

61
Jibu P C_Adoor

Nur eine Einschränkung, die über DateDiff hinzugefügt werden muss, zählt die Anzahl der Male, an denen Sie die von Ihnen festgelegte Grenze überschreiten, als Ihre Einheiten. Wenn Sie also nach einer genauen Zeitspanne suchen, gibt es Probleme.

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

gibt eine Antwort von 1, da es die Grenze von Januar bis Februar überschritt. Obwohl der Zeitraum 2 Tage beträgt, würde datediff einen Wert von 1 zurückgeben - es überschritt 1 Datumsgrenze.

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

Gibt einen Wert von 1 zurück, überschritt die Minutengrenze einmal. Wenn sie also etwa 14 Sekunden beträgt, wird sie als Minute angezeigt, wenn Minuten als Einheiten verwendet werden.

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

Ersetzen Sie "MyUnits" basierend auf DATEDIFF auf MSDN

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

Ersetzen Sie day durch andere Einheiten, in denen Sie die Differenz erhalten möchten, wie second, minute usw.

11
Quassnoi

Ich kann vier wichtige Funktionen von MS SQL Server erwähnen, die sehr nützlich sein können:

1) Die Funktion DATEDIFF () ist für die Berechnung der Differenzen zwischen zwei Datumsangaben verantwortlich. Das Ergebnis könnte "Jahr Viertel Monat Tag Tag Jahr Stunde Minute Sekunde Millisekunde Nanosekunde", angegeben im ersten Parameter (Datumsteil):

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

2) Sie können die Funktion GETDATE () verwenden, um die aktuelle Uhrzeit zu ermitteln und die Differenzen eines Datums und eines aktuellen Datums zu berechnen:

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

3) Eine weitere wichtige Funktion ist DATEADD () , die zum Konvertieren einiger Werte in datetime verwendet wird, wobei derselbe Datumsteil des Datediff verwendet wird, den Sie hinzufügen (mit positiven Werten) oder subtrahieren (mit negativen Werten) ein Basisdatum:

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

4) Die Funktion CONVERT () wurde erstellt, um das Datum wie gewünscht zu formatieren. Dies ist keine parametrische Funktion. Sie können jedoch einen Teil des Ergebnisses verwenden, um das Ergebnis wie gewünscht zu formatieren:

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 kann in Sekunden berechnet werden. Ein interessantes Ergebnis beim Mischen dieser vier Funktionen besteht darin, einen formatierten Unterschied zwischen Stunden, Minuten und Sekunden (hh: mm: ss) zwischen zwei Datumsangaben zu zeigen:

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)

... das Ergebnis ist 00:10:38 (638s = 600s + 38s = 10 Minuten und 38 Sekunden)

Ein anderes Beispiel:

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

Es gibt verschiedene Möglichkeiten, Datumsunterschiede anzuzeigen, und mehr beim Vergleichen von Datum und Uhrzeit. Ich verwende hiermit den Unterschied zwischen zwei Datumsangaben, die als "HH: MM: SS" formatiert sind:

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)

Ich habe dies für eine berechnete Spalte verwendet, aber Sie könnten es trivial als UDF- oder Abfrageberechnung umschreiben. Beachten Sie, dass diese Logik Sekundenbruchteile abrundet. 00: 00.00 bis 00: 00.999 gilt als null Sekunden und wird als "00:00:00" angezeigt.

Wenn Sie davon ausgehen, dass die Perioden länger als ein paar Tage sein können, wechselt der Code bei Bedarf in das Format 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
4
user565869

Intern in SQL Server werden Datumsangaben als 2 Ganzzahlen gespeichert. Die erste ganze Zahl ist die Anzahl der Datumsangaben vor oder nach dem Basisdatum (1900/01/01). Die zweite Ganzzahl speichert die Anzahl der Uhrtakte nach Mitternacht, jeder Tick ist 1/300 einer Sekunde. 

Mehr Infos hier

Aus diesem Grund finde ich es oft am einfachsten, Datumsangaben zu vergleichen, indem sie einfach subtrahiert werden. Dies behandelt 90% meiner Anwendungsfälle. Z.B., 

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

Wenn ich eine Antwort in anderen Einheiten als Tagen brauche, benutze ich DateDiff .

4
RedFilter

Ich habe es so versucht und es hat funktioniert. Ich habe SQL Server Version 2016 verwendet

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

Unterschiedliche DATEDIFF-Funktionen sind:

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');

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

4
rchacko

Die folgende Abfrage sollte genau die Informationen enthalten, nach denen Sie Ausschau halten.

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

Hier ist der Link von MSDN, was alles mit der Datediff-Funktion möglich ist https://msdn.Microsoft.com/de-de/library/ms189794.aspx

3
Prateek

Ok, wir alle wissen, dass die Antwort DATEDIFF() beinhaltet. Aber das gibt Ihnen nur die Hälfte des gewünschten Ergebnisses. Was ist, wenn Sie die Ergebnisse in einem für Menschen lesbaren Format erhalten möchten, in Minuten und Sekunden zwischen zwei DATETIME-Werten?

Die Funktionen CONVERT(), DATEADD() und natürlich DATEDIFF() sind ideal für ein besser lesbares Ergebnis, das Ihre Kunden anstelle einer Nummer verwenden können.

d.h.

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

Dies gibt Ihnen etwas wie:

HH: MM

Wenn Sie mehr Präzision wünschen, erhöhen Sie einfach die VARCHAR().

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

HH: MM.SS.MS

1
Fandango68

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 funktioniert am besten

0
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 dezimal (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),@[email protected])

--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),@[email protected]) --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'

ENDE

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

select CAST((@[email protected]) as time(0))
0
Kash

Bitte überprüfen Sie den Trick, um den Datumsunterschied zwischen zwei Datumsangaben zu ermitteln 

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

hier können Sie Ihre Anforderungen ändern, je nachdem, ob Sie einen Unterschied zwischen Tagen oder Monaten oder Jahr oder Zeit wünschen. 

0
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

Ich dachte nur, ich würde es erwähnen. 

0
Used_By_Already

Verwenden Sie dies für 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

Das ist also nicht meine Antwort, aber ich habe es nur gefunden, als ich online nach einer Frage wie dieser gesucht habe. Dieser Typ hat ein Verfahren eingerichtet, um Stunden, Minuten und Sekunden zu berechnen. Der link und der Code:

--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'
)
0
Jfabs

Für mich hat das perfekt geklappt Konvertieren (varchar (8), DATEADD (SECOND, DATEDIFF (SECOND, LogInTime, LogOutTime), 0), 114)

und die Ausgabe ist HH: MM: SS, was in meinem Fall genau gezeigt wird.

0
clarifier
SELECT DATEDIFF(yyyy, '2011/08/25', '2017/08/25') AS DateDiff

Es gibt einen Unterschied zwischen zwei Daten in Jahr  

Hier (2017-2011) = 6 als Ergebnis

Syntax:

DATEDIFF(interval, date1, date2)
0
Abhishek Kanrar

Überprüfen Sie DateDiff in der Onlinedokumentation.

0
Martin Clarke

PRINT DATEDIFF (zweitens, 2010-01-22 15: 29: 55.090 ',' 2010-01-22 15: 30: 09.153 ')

0