Gibt es eine Möglichkeit, den Unterschied zwischen zwei datetime
im SQL-Server zu nehmen?
Zum Beispiel sind meine Termine
2010-01-22 15:29:55.090
2010-01-22 15:30:09.153
Das Ergebnis sollte also 14.063 seconds
sein.
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.
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
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.
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
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
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.
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 .
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
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
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
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
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
declare @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12'
select CAST((@[email protected]) as time(0))
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.
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.
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)
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'
)
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.
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)
Überprüfen Sie DateDiff in der Onlinedokumentation.
PRINT DATEDIFF (zweitens, 2010-01-22 15: 29: 55.090 ',' 2010-01-22 15: 30: 09.153 ')