web-dev-qa-db-fra.com

Différence de deux date et heure dans le serveur SQL

Est-il possible de prendre la différence entre deux datetime dans le serveur SQL?

Par exemple, mes dates sont

  1. 2010-01-22 15:29:55.090
  2. 2010-01-22 15:30:09.153

Donc, le résultat devrait être 14.063 seconds.

61
Jibu P C_Adoor

Juste une mise en garde à ajouter à propos de DateDiff, il compte le nombre de fois que vous dépassez la limite que vous spécifiez en tant qu'unités. Il est donc sujet à des problèmes si vous recherchez une période précise.

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

donne une réponse de 1, car il a franchi la limite de janvier à février. Ainsi, même si la durée est de 2 jours, datiff renverrait une valeur de 1 - il a franchi une limite de date.

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

Donne une valeur de 1; encore une fois, il a dépassé la limite des minutes une fois. Par conséquent, même s’il s’agit d’environ 14 secondes, il est renvoyé sous la forme d’une minute lorsque les unités sont utilisées.

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

Remplacez "MyUnits" basé sur DATEDIFF sur MSDN

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

Remplacez day par d'autres unités dans lesquelles vous souhaitez obtenir la différence, telles que second, minute etc.

11
Quassnoi

Je peux mentionner quatre fonctions importantes de MS SQL Server qui peuvent être très utiles:

1) La fonction DATEDIFF () est chargée de calculer les différences entre deux dates. Le résultat pourrait être "année trimestre mois jour jour année année semaine heure minute seconde millisecondes microsecondes nanosecondes", spécifiée sur le premier paramètre (datepart):

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

2) Vous pouvez utiliser la fonction GETDATE () pour obtenir l’heure réelle et calculer les différences de date et de date réelle:

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

3) Une autre fonction importante est DATEADD () , utilisée pour convertir une valeur datetime en utilisant le même datepart de la date indiquée, que vous pouvez ajouter (avec des valeurs positives) ou soustraire (avec des valeurs négatives) une date de base:

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

4) La fonction CONVERT () a été créée pour formater la date comme vous le souhaitez, ce n'est pas une fonction paramétrique, mais vous pouvez utiliser une partie du résultat pour formater le résultat comme vous le souhaitez:

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 cold peut être calculé en secondes et un résultat intéressant mélangeant ces quatre fonctions est de montrer une différence formulée en heures, minutes et secondes (hh: mm: ss) entre deux dates:

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)

... le résultat est 00:10:38 (638s = 600s + 38s = 10 minutes et 38 secondes)

Un autre exemple:

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

Il existe un certain nombre de façons de prendre en compte une différence de date et davantage lorsque vous comparez des dates/heures. Voici ce que j'utilise pour obtenir la différence entre deux dates au format "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)

Je l'ai utilisé pour une colonne calculée, mais vous pouvez facilement l'écrire sous forme de calcul UDF ou de requête. Notez que cette logique arrondit les fractions de seconde; 00: 00.00 à 00: 00.999 correspond à zéro seconde et s'affiche sous la forme "00:00:00".

Si vous prévoyez que les périodes peuvent durer plus de quelques jours, ce code bascule au format D: HH: MM: SS si nécessaire:

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

En interne, dans SQL Server, les dates sont stockées sous forme de 2 entiers. Le premier entier est le nombre de dates avant ou après la date de base (1900/01/01). Le second entier stocke le nombre de ticks d'horloge après minuit, chaque tick correspond à 1/300 de seconde. 

Plus d'infos ici

Pour cette raison, je trouve souvent que le moyen le plus simple de comparer des dates consiste à les soustraire. Cela gère 90% de mes cas d'utilisation. Par exemple., 

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

Quand j'ai besoin d'une réponse en unités autres que des jours, j'utilise DateDiff .

4
RedFilter

J'ai essayé de cette façon et cela a fonctionné. J'ai utilisé SQL Server version 2016

SELECT DATEDIFF(MILLISECOND,'2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')/1000.00;

Les différentes fonctions de DATEDIFF sont:

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');

Réf.: https://docs.Microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017

4
rchacko

La requête suivante devrait donner exactement ce que vous recherchez.

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

Voici le lien de MSDN pour tout ce que vous pouvez faire avec la fonction de datiff . https://msdn.Microsoft.com/en-us/library/ms189794.aspx

3
Prateek

Ok, nous savons tous que la réponse implique DATEDIFF(). Mais cela ne vous donne que la moitié du résultat que vous recherchez. Que faire si vous voulez obtenir les résultats dans un format lisible par l'homme, en termes de minutes et de secondes entre deux valeurs DATETIME?

Les fonctions CONVERT(), DATEADD() et bien sûr DATEDIFF() sont idéales pour un résultat plus facilement lisible que vos clients peuvent utiliser au lieu d’un nombre.

c'est à dire.

CONVERT(varchar(5), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114) 

Cela vous donnera quelque chose comme:

HH: MM

Si vous voulez plus de précision, augmentez simplement la VARCHAR().

CONVERT(varchar(12), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114) 

HH: MM.SS.MS

1
Fandango68

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 fonctionne le mieux

0
Lalitha Poluri

CRÉER UNE FONCTION getDateDiffHours (@fdate AS datetime, @ tdate as datetime). DECLARE @cnt int DECLARE @cntDate datetime DÉCLARE @dayDiff int DÉCLARE @dayDiffWk int DECLARE @hrsDiff décimale (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'

FIN

0
George Hedley
declare @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12'

select CAST((@dt2-@dt1) as time(0))
0
Kash

S'il vous plaît vérifier ci-dessous l'astuce pour trouver la différence de date entre deux dates 

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

où vous pouvez changer en fonction de vos besoins en tant que différence de jours, de mois, d’année ou de temps. 

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

Je pensais juste que je le mentionnerais. 

0
Used_By_Already

Utilisez ceci pour 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) 
0
user3777604

Donc, ce n’est pas ma réponse, mais j’ai trouvé ce résultat en cherchant en ligne une question comme celle-ci. Ce gars a mis en place une procédure pour calculer les heures, les minutes et les secondes. Le lien et le 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'
)
0
Jfabs

Pour moi, cela a parfaitement fonctionné Convertir (varchar (8), DATEADD (SECOND, DATEDIFF (SECOND, LogInTime, LogOutTime), 0), 114)

et la sortie est HH: MM: SS, ce qui est indiqué avec précision dans mon cas.

0
clarifier
SELECT DATEDIFF(yyyy, '2011/08/25', '2017/08/25') AS DateDiff

Cela vous donne la différence entre deux dates en Année  

Ici (2017-2011) = 6 à la suite

Syntaxe:

DATEDIFF(interval, date1, date2)
0
Abhishek Kanrar

Vérifiez DateDiff sur Books Online.

0
Martin Clarke

DATE DE DATE (deuxième, '2010-01-22 15: 29: 55.090', '2010-01-22 15: 30: 09.153')

0
Abhishek Jaiswal