2010-01-22 18 views

Odpowiedz

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

zastępcze "MyUnits" w oparciu o DATEDIFF on MSDN

0

Sprawdź DateDiff wychodzący z Books Online.

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

Wymień day z innymi jednostkami chcesz uzyskać różnicę, jak second, minute itp

73

Wystarczy dodać zastrzeżenie o DateDiff, że zlicza ile razy przechodzić granicę określić jako twoje jednostki, więc masz problem, jeśli szukasz dokładnego czasu. np.

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

daje odpowiedź na poziomie 1, ponieważ przekroczył granicę w okresie od stycznia do lutego, więc mimo że rozpiętość wynosi 2 dni, DateDiff zwróci wartość 1 - przekroczyła 1 Data granicę.

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

daje wartość 1, ponownie, przeszedł granicę minut raz, więc mimo że jest ok 14 sekund, to być zwracane jako jednej minuty przy użyciu minucie jednostek.

+8

+1 za bycie jedyną osobą, która do tej pory wspomniała o tym zachowaniu. Spowodowało to dla mnie nieoczekiwany problem, ponieważ nie zrobiłem RTFM :) – Thorarin

4

Wewnętrznie w SQL Server daty są przechowywane jako 2 liczby całkowite. Pierwsza liczba całkowita to liczba dat przed lub po dacie bazowej (1900/01/01). Druga liczba całkowita przechowuje liczbę tyknięć zegara po północy, każde tiknięcie wynosi 1/300 sekundy.

More info here

Z tego powodu często znaleźć najprostszy sposób na porównanie dat jest po prostu odjąć im. Zajmuje to 90% moich przypadków użycia. Np

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

Kiedy potrzebuję odpowiedź w jednostkach innych niż dni, będę używać DateDiff.

+4

Należy zauważyć, że dotyczy to tylko starego typu 'DATETIME', a nie' DATE', 'TIME' lub' DATETIME2'. Ponadto zwrócona wartość będzie kolejnym "DATETIME", więc musisz go przesłać, aby uzyskać czytelną liczbę dni między datami. –

0

To nie jest moja odpowiedź, ale znalazłem to podczas wyszukiwania w Internecie na takie pytanie, jak również. Ten facet ustanowił procedurę obliczania godzin, minut i sekund. link i kod:

--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

Istnieje wiele sposobów, aby spojrzeć na różnicę dat, a przy porównywaniu datę/razy. Oto co mam użyć, aby uzyskać różnicę między dwoma datami sformatowanych jako „hh: mm: ss”:

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) 

użyłem tego na kolumnie obliczeniowej, ale można trywialnie przepisać go jako obliczenia UDF lub zapytań.Zauważcie, że ta logika kończy się ułamkowymi sekundami; 00: 00.00 do 00: 00.999 jest uważane za zero sekund i wyświetlane jako "00:00:00".

Jeśli przewidujesz, że okresy może być więcej niż kilka dni długo, kod ten przełącza do D: hh: mm: ss, gdy są potrzebne:

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

mogę wspomnieć cztery ważne funkcje MS SQL Server, które mogą być bardzo przydatne:

1) funkcja DATEDIFF() odpowiedzialny jest do obliczenia różnic pomiędzy dwiema datami, wynik może być "roku dzień kwartał miesięcy DAYOFYEAR tygodnie godziny minuty sekundy milisekundy mikrosekund nanosekundy”, określony w pierwszym parametrze (datepart):

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

2) Można użyć funkcji GETDATE() aby uzyskać czas rzeczywisty i obliczyć różnice jakiejś dacie i rzeczywistą datą:

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

3) Inną ważną funkcją jest DATEADD(), używana do konwersji pewnej wartości w datetime przy użyciu tego samego datepart z datediff, którą można dodać (z wartościami dodatnimi) lub odjąć (z wartościami ujemnymi) do jednej daty bazowej:

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

4) Funkcja CONVERT() powstał formatować datę jak trzeba, to nie jest funkcja parametryczna, ale można wykorzystać część wyniku formatowania wynik jak trzeba:

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 zimno jest obliczana sekund Interesującą wyniku zmieszania tych czterech funkcją jest pokazują formatowany różnica um godziny, minuty i sekundy (HH: mM: sS) pomiędzy dwiema datami:

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) 

... wynik jest 0:10:38 (638s = 600s + 38s = 10 minut i 38 sekundy)

Innym przykładem

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

DRUK DATEDIFF (II '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 

Pomyślałem, że o tym wspomnę.

0

TWORZENIE getDateDiffHours funkcyjnych (@fdate AS datetime @ tdate jak datetime) powroty varchar (50) CO UŻYCIEM DEKLARUJĄ @cnt int DECLARE @cntDate DateTime DEKLARUJĄ @dayDiff int DECLARE @dayDiffWk Int DEKLARUJĄ @hrsDiff dziesiętny (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

Czy możesz wyjaśnić swój kod zgodnie z pytaniem? – 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 działa najlepiej

0

, aby znaleźć różnicę pomiędzy dwoma datami daty

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

gdzie można zmieniać w zależności od Państwa wymagań, jak chcesz różnicę dni lub miesiąc lub rok lub raz proszę sprawdzić poniżej sztuczki.

Powiązane problemy