2010-01-22 18 views

Respuesta

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

sustitutivos "MyUnits" basados ​​en DATEDIFF on MSDN

0

Comprobar DifFecha a cabo en los libros en pantalla.

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

Reemplazar day con otras unidades que desea obtener la diferencia de, como second, etc. minute

73

Sólo una advertencia que añadir sobre DifFecha, se cuenta el número de veces que pasa el límite que especifique como sus unidades, entonces está sujeto a problemas si está buscando un intervalo de tiempo preciso. p.

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

da una respuesta de 1, ya que cruzó la frontera entre enero y febrero, así que a pesar de que la duración es de 2 días, datediff devolvería un valor de 1 - 1 cruzó la fecha límite.

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

da un valor de 1, de nuevo, pasó el límite minutos una vez, por lo que a pesar de que es de aproximadamente 14 segundos, que sería devuelto como un solo minuto cuando se utiliza Minutos como las unidades.

+8

+1 por ser el único hasta ahora que menciona este comportamiento. Me causó un problema inesperado una vez porque no lo hice RTFM :) – Thorarin

4

internamente en las fechas de SQL Server se almacenan como 2 enteros. El primer entero es el número de fechas anteriores o posteriores a la fecha base (1900/01/01). El segundo entero almacena la cantidad de marcas de reloj después de la medianoche, cada tic es 1/300 de segundo.

More info here

Debido a esto, a menudo encuentro la forma más sencilla de comparar fechas es simplemente restar ellos. Esto maneja el 90% de mis casos de uso. Por ejemplo,

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

Cuando necesito una respuesta en unidades distintas de los días, voy a utilizar DateDiff.

+4

Tenga en cuenta que esto solo se aplica al tipo anterior 'DATETIME', no a' DATE', 'TIME', o' DATETIME2'. Además, el valor devuelto será otro 'DATETIME', por lo que deberá lanzarlo para obtener el número legible por humanos de días entre fechas. –

0

Así que esto no es mi respuesta, pero me acaba de encontrar este mientras que la búsqueda en línea para alrededor de una pregunta como ésta también. Este chico estableció un procedimiento para calcular horas, minutos y segundos. El link y el código:

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

Hay un número de maneras de ver una diferencia de fechas, y más cuando se compara fecha/horas. Esto es lo que utilizo para obtener la diferencia entre dos fechas con el formato "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) 

He utilizado este para una columna calculada, pero trivial podría volver a escribir como un cálculo UDF o consulta.Tenga en cuenta que esta lógica redondea fracciones de segundos; 00: 00.00 a 00: 00.999 se considera cero segundos y se muestra como "00:00:00".

Si prevé que los períodos pueden ser más de unos pocos días de duración, este código cambia a D: HH: MM: SS cuando sea necesario:

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

puedo mencionar cuatro funciones importantes de MS SQL Server que puede ser muy útil:

1) la función DATEDIFF() es responsable de calcular las diferencias entre dos fechas, el resultado podría ser "año cuarto de día mes dayofyear semana hora minuto segundo milisegundos microsegundo nanosegundo", especificado en el primer parámetro (datepart):

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

2) Se puede utilizar la función GETDATE() para obtener la hora actual y calcular las diferencias de una fecha y hora actual:

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

3) Otra función importante es DATEADD(), utilizada para convertir algún valor en fecha y hora usando la misma datepart de la fechada, que puede agregar (con valores positivos) o restar (con valores negativos) a una fecha 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 función CONVERT() se hizo para dar formato a la fecha como que necesita, no es función paramétrica, pero se puede utilizar parte del resultado para formatear el resultado como que necesita:

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 frío se calculará en el segundo y un resultado interesante mezclar estos cuatro función es para mostrar una diferencia formated um horas, minutos y segundos (hh: mm: ss) entre dos fechas:

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) 

... El resultado es 00:10:38 (638s = 600s + 38S = 10 minutos y 38 segundos)

Otro ejemplo:

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

PRINT DATEDIFF (segundo, '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 

Simplemente pensé que había menciono.

1

La siguiente consulta debería dar exactamente las cosas que está buscando.

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

Aquí está el enlace de MSDN para todo lo que puede hacer con la función de fechado. https://msdn.microsoft.com/en-us/library/ms189794.aspx

0

CREATE getDateDiffHours de función (@fdate AS de fecha y hora, @ TDate como fecha y hora) VUELVE varchar (50) AS COMENZAR 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' 

FIN

+0

¿Puedes explicar tu código de acuerdo con la pregunta? – 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 funciona mejor

0

Por favor, consulte más abajo truco para encontrar la diferencia de fechas entre dos fechas

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

donde se puede cambiar de acuerdo a sus necesidades como desee diferencia de días o meses o años o el tiempo.

Cuestiones relacionadas