2010-01-22 20 views

Antwort

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

Substitute "MyUnits", basierend auf DATEDIFF on MSDN

0

prüfen DatDiff heraus Books Online.

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

ersetzen day mit anderen Einheiten wollen Sie den Unterschied zu bekommen, wie second, minute usw.

73

Nur eine Einschränkung über DatDiff hinzuzufügen, es zählt die Anzahl, wie oft Sie die Grenze passieren Sie angeben, als Ihre Einheiten, so ist problematisch, wenn Sie nach einer genauen Zeitspanne suchen. z.B.

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

gibt eine Antwort von 1, weil es die Grenze von Januar bis Februar gekreuzt, so dass, obwohl die Spanne 2 Nächte, datediff würde einen Wert von 1 zurückkehren - es gekreuzt 1 date Grenze.

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

einen Wert von 1 gibt, wieder reichte es die Minute Grenze einmal, so dass, obwohl es ca. 14 Sekunden ist, würde es als eine Minute zurückgeschickt werden, wenn Minuten, da die Einheiten verwenden.

+8

+1 für die einzige bis jetzt, die dieses Verhalten erwähnt. Es verursachte ein unerwartetes Problem für mich einmal, weil ich nicht RTFM :) – Thorarin

4

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

More info here

dieser Weil ich oft die einfachste Art und Weise finden Daten zu vergleichen, ist sie einfach zu subtrahieren. Dies behandelt 90% meiner Anwendungsfälle. Z. B.

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

Wenn ich in anderen Einheiten als Tagen eine Antwort benötigen, werde ich DateDiff verwenden.

+4

Beachten Sie, dass dies nur für den alten "DATETIME" -Typ gilt, nicht für "DATE", "TIME" oder "DATETIME2". Der Wert, der zurückgegeben wird, ist ebenfalls ein 'DATETIME'. Sie müssen ihn also umwandeln, um die Anzahl der Tage zwischen den Daten zu erhalten, die für Menschen lesbar sind. –

0

Also das ist nicht meine Antwort, aber ich habe gerade gefunden, während Sie online für eine Frage wie diese auch suchen. Dieser Typ hat eine Prozedur eingerichtet, um Stunden, Minuten und Sekunden zu berechnen. Die 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' 
) 
4

Es gibt eine Reihe von Möglichkeiten, zu einem Zeitpunkt Unterschied zu suchen, und mehr, wenn Datum Vergleich/Zeiten. Hier ist, was ich verwende, um den Unterschied zwischen zwei Daten als „HH: MM: SS“: formatieren zu bekommen

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 dies für eine berechnete Spalte verwendet, aber man konnte trivialer es als UDF oder Abfrageberechnung neu schreiben.Beachten Sie, dass diese Logik Bruchteile von Sekunden abrundet; 00: 00.00 bis 00: 00.999 wird als Null Sekunden betrachtet und als "00:00:00" angezeigt.

Wenn Sie, dass Perioden antizipieren mehr sein kann als ein paar Tage lang, dieser Code schaltet auf D: HH: MM: SS-Format bei Bedarf:

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 
0
declare @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12' 

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

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

1) die Funktion DATEDIFF() verantwortlich Unterschiede zwischen zwei Daten zu berechnen, könnte das Ergebnis sein "Jahr Quartal Monat dayofyear Tag Woche Stunde Minute Sekunde Millisekunde Mikrosekunde Nanosekunde“, im ersten Parameter angegeben (Datumsteil):

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

2) Sie können die Funktion nutzen GETDATE() die aktuelle Zeit und berechnen Differenzen einiger Datum und aktuelle Datum zu erhalten:

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

3) Eine weitere wichtige Funktion ist DATEADD(), die verwendet wird, um einen Wert in datetime mit demselben dateiteil des datediffs zu konvertieren, den Sie einem Basisdatum hinzufügen (mit positiven Werten) oder subtrahieren (mit negativen Werten):

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() gemacht wurde, das Datum zu formatieren, wie Sie benötigen, ist es nicht parametrische Funktion ist, aber Sie können einen Teil des Ergebnisses verwenden um das Ergebnis zu formatieren, wie Sie benötigen:

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- Kälte in Sekunden und ein interessantes Ergebnis berechnet Mischen dieser vier Funktions einen formated Unterschied zu zeigen, um Stunden, Minuten und Sekunden (hh: mm: ss) zwischen zwei Daten:

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 weiteres Beispiel:

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

PRINT DATEDIFF (zweite, '2010- 01-22 15: 29: 55,090' , '2010-01-22 15: 30: 09,153')

0
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 

Gerade dachte ich, es erwähnen würde.

1

Die folgende Abfrage sollte genau die Dinge 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 für das, was alles, was Sie mit DATEDIFF Funktion tun können. https://msdn.microsoft.com/en-us/library/ms189794.aspx

0

FUNCTION getDateDiffHours CREATE (@fdate als Datum- @ TDate als Datum-) VARCHAR RETURNS (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),@[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' 

END

+0

Können Sie Ihren Code anhand der Frage erklären? – user7294900

0

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

Überprüfen Sie bitte unten Trick, um das Datum Differenz zwischen zwei Daten

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

wo Sie ändern Ihre Anforderung nach kann zu finden, wie Sie Unterschied von Tag oder Monat oder Jahr oder Zeit möchten.

Verwandte Themen