Gibt es eine Möglichkeit, den Unterschied zwischen zwei zu nehmen? datetime
in SQL Server zu nehmen?
Zum Beispiel sind meine Daten
2010-01-22 15:29:55.090
2010-01-22 15:30:09.153
Das Ergebnis sollte also sein 14.063 seconds
.
Gibt es eine Möglichkeit, den Unterschied zwischen zwei zu nehmen? datetime
in SQL Server zu nehmen?
Zum Beispiel sind meine Daten
2010-01-22 15:29:55.090
2010-01-22 15:30:09.153
Das Ergebnis sollte also sein 14.063 seconds
.
Antworten:
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.
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
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
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
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 DATETIME
Werten 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
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.
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 .
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
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
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)
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'
)
PRINT DATEDIFF (zweitens '2010-01-22 15: 29: 55.090', '2010-01-22 15: 30: 09.153')
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.
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
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
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.
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)
Überprüfen Sie DateDiff auf Books Online.
datediff
Antworten, aber keine scheint Sie daran zu erinnern, dass Sie abhängig von der Parameterreihenfolge möglicherweise negative Ergebnisse erhalten.