Unterschied von zwei Datums- und Uhrzeitangaben im SQL Server

83

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

Zum Beispiel sind meine Daten

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

Das Ergebnis sollte also sein 14.063 seconds.

Jibu P C_Adoor
quelle
2
Sie erhalten alle datediffAntworten, aber keine scheint Sie daran zu erinnern, dass Sie abhängig von der Parameterreihenfolge möglicherweise negative Ergebnisse erhalten.
Pasi Savolainen

Antworten:

94

Nur eine Einschränkung für DateDiff: Es zählt, wie oft Sie die Grenze überschreiten, die Sie als Einheiten angegeben haben. Wenn Sie also nach einer genauen Zeitspanne suchen, treten Probleme auf. z.B

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

gibt eine Antwort von 1, da es die Grenze von Januar bis Februar überschritten hat. Obwohl die Spanne 2 Tage beträgt, würde datiert einen Wert von 1 zurückgeben - es hat 1 Datumsgrenze überschritten.

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

Gibt einen Wert von 1 aus, hat die Minutengrenze einmal überschritten. Obwohl sie ca. 14 Sekunden beträgt, wird sie bei Verwendung von Minuten als Einheiten als einzelne Minute zurückgegeben.

Andrew
quelle
29
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

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

Ersetzen Sie daymit anderen Einheiten , die Sie wollen in den Unterschied zu bekommen, wie second, minuteusw.

Quassnoi
quelle
16

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 Daten verantwortlich. Das Ergebnis könnte " Jahr, Viertel, Monat, Tag, Jahr, Woche, Stunde, Minute, Sekunde, Millisekunde, Mikrosekunde, Nanosekunde " sein, angegeben im ersten Parameter ( Datumsteil ):

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

2) Mit der Funktion GETDATE () können Sie die tatsächliche Uhrzeit abrufen und Differenzen zwischen einem bestimmten Datum und einem tatsächlichen Datum berechnen:

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

3) Eine weitere wichtige Funktion ist DATEADD () , mit der ein Wert in Datum / Uhrzeit mit demselben Datumsteil des Datums konvertiert wird, den Sie zu einem Basisdatum hinzufügen (mit positiven Werten) oder subtrahieren (mit negativen Werten) können:

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. Es ist keine parametrische Funktion, aber Sie können 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 kalt wird in Sekunden berechnet und ein interessantes Ergebnis beim Mischen dieser vier Funktionen besteht darin, eine formulierte Differenz um Stunden, Minuten und Sekunden ( hh: mm: ss ) zwischen zwei Daten anzuzeigen :

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
lynx_74
quelle
9

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;

Verschiedene 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

rchacko
quelle
6

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

Das CONVERT(), DATEADD()und natürlichDATEDIFF() Funktionen sind perfekt für ein leichtes lesbares Ergebnis , dass Ihre Kunden statt einer Zahl verwenden können.

dh

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

Dies gibt Ihnen so 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

Fandango68
quelle
5

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

Mehr Infos hier

Aus diesem Grund finde ich es oft am einfachsten, Daten zu vergleichen, indem ich sie einfach subtrahiere. 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 benötige, verwende ich DateDiff .

RedFilter
quelle
6
Beachten Sie, dass dies nur für die alte gilt DATETIMEArt, nicht auf DATE, TIMEoder DATETIME2. Der zurückgegebene Wert ist auch ein anderer DATETIME, sodass Sie ihn umwandeln müssen, um die lesbare Anzahl von Tagen zwischen den Daten zu erhalten.
5

Es gibt verschiedene Möglichkeiten, um einen Datumsunterschied zu ermitteln, und mehr, wenn Sie Datum und Uhrzeit vergleichen. Folgendes verwende ich, um den Unterschied zwischen zwei als "HH: MM: SS" formatierten Daten zu ermitteln:

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önnen es trivial als UDF- oder Abfrageberechnung umschreiben. Beachten Sie, dass diese Logik Sekundenbruchteile abrundet. 00: 00.00 bis 00: 00.999 wird als Null Sekunden betrachtet und als "00:00:00" angezeigt.

Wenn Sie davon ausgehen, dass die Zeiträume länger als einige Tage dauern können, wechselt dieser 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

quelle
5

Die folgende Abfrage sollte genau das enthalten, wonach Sie suchen.

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

Hier ist der Link von MSDN für alles, was Sie mit der Datumstiff-Funktion tun können. https://msdn.microsoft.com/en-us/library/ms189794.aspx

Prateek
quelle
3
SELECT DATEDIFF(yyyy, '2011/08/25', '2017/08/25') AS DateDiff

Es gibt Ihnen einen Unterschied zwischen zwei Daten im Jahr

Hier (2017-2011) = 6 als Ergebnis

Syntax:

DATEDIFF(interval, date1, date2)
Abhishek Kanrar
quelle
1

Das ist also nicht meine Antwort, aber ich habe sie gerade gefunden, als ich online nach einer solchen Frage gesucht habe. Dieser Typ hat ein Verfahren zur Berechnung von Stunden, Minuten und Sekunden eingerichtet. 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'
)
Jfabs
quelle
1
declare @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12'

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

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

Abhishek Jaiswal
quelle
1
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.

Used_By_Already
quelle
1

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'

ENDE

George Hedley
quelle
1
Können Sie Ihren Code entsprechend der Frage erklären?
user7294900
1

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

Lalitha Poluri
quelle
1

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

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

Hier können Sie je nach Anforderung Änderungen vornehmen, wenn Sie einen Unterschied zwischen Tagen, Monaten, Jahren oder Zeiten wünschen.

Bha15
quelle
1

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) 
user3777604
quelle
0

Überprüfen Sie DateDiff auf Books Online.

Martin Clarke
quelle
0

Für mich funktionierte dies perfekt Konvertieren (varchar (8), DATEADD (ZWEITER, DATEDIFF (ZWEITER, LogInTime, LogOutTime), 0), 114)

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

Klärer
quelle