Czy jest jakiś sposób na różnicę między dwoma datetime
w serwerze sql?Różnica dwóch dat w serwerze sql
Na przykład, moje terminy są
2010-01-22 15:29:55.090
2010-01-22 15:30:09.153
więc wynik powinien być 14.063 seconds
.
Czy jest jakiś sposób na różnicę między dwoma datetime
w serwerze sql?Różnica dwóch dat w serwerze sql
Na przykład, moje terminy są
2010-01-22 15:29:55.090
2010-01-22 15:30:09.153
więc wynik powinien być 14.063 seconds
.
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
Sprawdź DateDiff wychodzący z Books Online.
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
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.
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.
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.
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. –
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'
)
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
declare @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12'
select CAST((@[email protected]) as time(0))
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
DRUK DATEDIFF (II '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
Pomyślałem, że o tym wspomnę.
Poniższe zapytanie powinno zawierać dokładnie te rzeczy, których szukasz.
select datediff(second, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')
Oto link z MSDN, aby dowiedzieć się, co można zrobić z funkcją Datediff. https://msdn.microsoft.com/en-us/library/ms189794.aspx
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
Czy możesz wyjaśnić swój kod zgodnie z pytaniem? – user7294900
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
, 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.
+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